获取文本视图以使用自动布局占据整个单元格

时间:2017-06-16 00:24:24

标签: ios swift autolayout

我正在尝试使用单元格创建一个表格视图,每个单元格都包含一个文本视图,该视图应该占据整个单元格并调整单元格的高度以适合其内容。相应地设置水平和垂直内容拥抱和压缩阻力优先级。

我已将单元格设置为具有自动高度

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44

在我的cellForRowAt...中,我为文本视图的顶部,前导,尾部和底部边创建约束,将其约束在单元格的内容视图中。

问题在于,在运行时,文本视图不会占用多行并增加单元格的大小。它取而代之的是从单元格的后缘运行。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
    cell.translatesAutoresizingMaskIntoConstraints = false
    cell.contentView.translatesAutoresizingMaskIntoConstraints = false
    let entry = server.log[indexPath.row]
    let textView = UITextView()
    textView.isScrollEnabled = false
    textView.isEditable = false
    //textView.isUserInteractionEnabled = true
    textView.text = entry.message
    textView.translatesAutoresizingMaskIntoConstraints = false
    cell.contentView.addSubview(textView)

    let top = NSLayoutConstraint(item: textView, attribute: .top, relatedBy: .equal, toItem: cell.contentView, attribute: .topMargin, multiplier: 1.0, constant: 0)
    let leading = NSLayoutConstraint(item: textView, attribute: .leading, relatedBy: .equal, toItem: cell.contentView, attribute: .leadingMargin, multiplier: 1.0, constant: 0)

    let trailing = NSLayoutConstraint(item: textView, attribute: .trailing, relatedBy: .equal, toItem: cell.contentView, attribute: .trailingMargin, multiplier: 1.0, constant: 0)
    let bottom = NSLayoutConstraint(item: textView, attribute: .bottom, relatedBy: .equal, toItem: cell.contentView, attribute: .bottomMargin, multiplier: 1.0, constant: 0)

    //top.priority = 999
    //leading.priority = 999
    trailing.priority = 999
    bottom.priority = 999

    cell.contentView.addConstraints([top, bottom, leading, trailing])

    textView.setContentCompressionResistancePriority(1000, for: .horizontal)
    textView.setContentCompressionResistancePriority(1000, for: .vertical)
    textView.setContentHuggingPriority(1001, for: .horizontal)
    textView.setContentHuggingPriority(1001, for: .vertical)

    return cell;
}

单元格在运行时的显示方式

How the cells appear at runtime

框架如何出现

How the frames appear

视图层次结构调试器报告的内容

What the view hierarchy debugger reports

3 个答案:

答案 0 :(得分:1)

您的代码中没有设置UITextView(或者它的框架)的高度。这意味着textView将根据您提供的约束具有计算框架。您可能希望为textView添加height约束,看看是否有效。

答案 1 :(得分:1)

如果可能,我会将您的UITextView更改为UITextField。 然后你可以在代码中执行此操作:

    let example = UITextField()
    example.adjustsFontSizeToFitWidth = true
    example.numberOfLines = 0

在界面构建器中,只需将.numberOfLines更改为0即可。

答案 2 :(得分:0)

According to the documentation

  

例如,如果文本中没有返回,则计算   将内容布局为单行所需的高度和宽度   文本。如果添加约束来指定视图的宽度,则   内在内容大小定义显示文本所需的高度   鉴于它的宽度。

鉴于此,使用内在内容大小的解决方案是为恒定宽度设置约束。我也选择使用UILabel,但这也适用于UITextView

let width = NSLayoutConstraint(item: textView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: cell.contentView.frame.width - cell.contentView.layoutMargins.left - cell.contentView.layoutMargins.right)

对于我的特殊情况,我还需要将底部约束的优先级设置为500,并将垂直内容压缩阻力设置为UILayoutPriorityRequired