【问题标题】:UITableViewCell resize UITextView from content and center verticallyUITableViewCell 从内容调整 UITextView 的大小并垂直居中
【发布时间】:2018-01-09 17:33:00
【问题描述】:

我有一个带有自定义 UITableViewCells 的 UITableView。自动布局已关闭。 UITableViewCell 包含 UILabelUITextViewUITextView 填充了长度不同的文本。如何动态调整UITextView 的高度?我在awakeFromNib 中使用此功能进行了尝试,在设置文本后但没有任何改变。

  func adjustHeight(theTextView: UITextView) {

    let contentSize = theTextView.sizeThatFits(theTextView.bounds.size)
    var frame = theTextView.frame
    frame.size.height = contentSize.height
    theTextView.frame = frame

    let aspectRatioTextViewConstraint = NSLayoutConstraint(item: theTextView, attribute: .height, relatedBy: .equal, toItem: theTextView, attribute: .width, multiplier: theTextView.bounds.height/theTextView.bounds.width, constant: 1)
    theTextView.addConstraint(aspectRatioTextViewConstraint)
}

【问题讨论】:

  • 你写的自动布局是关闭的,但是你在代码中手动添加它?什么意思?
  • 设置这些属性。 tableView.RowHeight = UITableView.AutomaticDimension; tableView.EstimatedRowHeight = 160f; // 根据您的单元格。计算文本视图的高度。如在此链接中:stackoverflow.com/a/25158206/1242673 将计算的高度应用于 textview。
  • @RomanPodymov 我做了吗?抱歉,我是 iOS 开发的新手,我的任务是让 textview 从内容中调整自身大小。我被告知自动布局已关闭。
  • @elpatricko 你试过我添加到答案中的例子吗?
  • 是的。我遇到的错误是由于我在 iOS 中的新手。 TextView 对容器来说太大了,没有显示新行......我很愚蠢。

标签: ios uitableview dynamic swift3 height


【解决方案1】:

试试这个

yourTextView.numberOfLines = 0

如果文本太长,这会将文本分成几行。

如果这不适合您并且您只想要 1 行,则在设置文本后添加此行(或在 textView 的委托函数中)。

yourTextView.sizeThatFits(yourFrame)

这将使文本变小以适合您为其指定的框架。

希望这会有所帮助!

【讨论】:

  • myTextView 没有 numberofLines 属性。我想根据需要使用尽可能多的行
  • 那有什么问题呢?
  • 文本太长,无法放在一行中。但是 UITableViewCell 只显示一行 TextView。没有调整大小
【解决方案2】:

我可以给你一个可以解决你问题的例子。我使用 SnapKit https://github.com/SnapKit/SnapKit 来更新 UIView 的约束。这是UIViewController 的示例,您希望在其中显示您的表格:

class ViewController: UIViewController {

    private var tableView : UITableView = {

        let tabView = UITableView.init(frame: CGRect.zero)
        tabView.register(TableViewCell.self, forCellReuseIdentifier: "cell")
        return tabView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.dataSource = self
        self.tableView.delegate = self
        self.view.addSubview(self.tableView)
    }

    override func updateViewConstraints() {

        self.tableView.snp.remakeConstraints { (maker) in

            maker.edges.equalTo(self.view) // your table will have the same frame as your view
        }

        super.updateViewConstraints()
    }
}

在第一个扩展中,我们将把UITableViewDelegate的所有方法:

extension ViewController : UITableViewDelegate {

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {

        return 200.0 // any value different from zero. 200 is an example. This value must be easy-to-calculate. 
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        return UITableViewAutomaticDimension // tells system that rows will be resized automatically
    }
}

在第二个扩展中有UITableViewDataSource的方法(只是生成一些随机数据):

extension ViewController : UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 20
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
        cell.setup(labelText: "Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label Label ", textViewText: "Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text ")
        return cell
    }
}

以及包含UILabelUITextView 的单元格类:

class TableViewCell: UITableViewCell {

    private var label : UILabel = {

        let resultLabel = UILabel.init(frame: CGRect.zero)
        resultLabel.numberOfLines = 0 // If numberOfLines in 0 system will automatically set real number of lines
        return resultLabel
    }()

    private var textView : UITextView = {

        let resultTextView = UITextView.init(frame: CGRect.zero)
        resultTextView.isScrollEnabled = false // disable scroll and editing just for example
        resultTextView.isEditable = false
        return resultTextView
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {

        super.init(style: style, reuseIdentifier: reuseIdentifier)

        self.contentView.addSubview(self.label)
        self.contentView.addSubview(self.textView)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func setup(labelText:String, textViewText:String) {

        self.label.text = labelText
        self.textView.text = textViewText
        self.setNeedsUpdateConstraints()
    }

    override func updateConstraints() {

        self.label.snp.remakeConstraints { (maker) in

            maker.left.equalTo(self.contentView.snp.left)
            maker.right.equalTo(self.contentView.snp.right)
            maker.top.equalTo(self.contentView.snp.top)
            maker.bottom.equalTo(self.textView.snp.top)
        }
        self.textView.snp.remakeConstraints { (maker) in

            maker.left.equalTo(self.contentView.snp.left)
            maker.right.equalTo(self.contentView.snp.right)
            maker.bottom.equalTo(self.contentView.snp.bottom)
        }
        super.updateConstraints()
    }
}

【讨论】:

    猜你喜欢
    • 2013-03-19
    • 2014-03-30
    • 2013-08-27
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多