我正在尝试使用单元格创建一个表格视图,每个单元格都包含一个文本视图,该视图应该占据整个单元格并调整单元格的高度以适合其内容。相应地设置水平和垂直内容拥抱和压缩阻力优先级。
我已将单元格设置为具有自动高度
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;
}
答案 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
。