动态UILabel和内容压缩/阻力

时间:2016-03-03 21:57:42

标签: ios swift autolayout uitableview

构建于Xcode 7.2.1,iOS 9.2

我有一个UITableView,其单元格具有自动高度。

tableView.estimatedRowHeight = 80
tableView.rowHeight = UITableViewAutomaticDimension

单元格的布局如下:

UITableViewCell
  contentView
  outerStackView - pinned to top, left, right, bottom edges of the contentView with autolayout
    leftColumnStackView - 38% of width of outerStackView
       topStackView
         label UILabel
         value UILabel
       bottomStackView
         label UILabel
         value UILabel
    middleColumnStackView - 38% of width of outerStackView
      ...
    rightColumnStackView - rest of the width of outerStackView
      ...

单元格中有6个标签/值对 - [标签X:值]。每个标签/值对由2 UILabels组成,其内容拥抱,内容压缩阻力属性相应设置,以提供所需的外观。

label.numberOfLines = 0
label.textAlignment = NSTextAlignment.Left
label.setContentCompressionResistancePriority(1000, forAxis: .Horizontal)
label.setContentHuggingPriority(1000, forAxis: .Horizontal)

value.numberOfLines = 0
value.setContentCompressionResistancePriority(500, forAxis: .Horizontal)
value.setContentHuggingPriority(500, forAxis: .Horizontal)

// there are 6 stack views, each containing a label/value pair
// the stack views are .Horizontal alignment, and pinned to the 
// columns they sit in
stackView.addArrangedSubview(label)
stackView.addArrangedSubview(value)

然而,有时单元格高度会适当地测量自身,有时候会增加一堆额外的空间(有趣的是,额外的空间总是等于 在内容压缩时会出现的空间/抱抱没有添加到任何一个标签)。

以下是发生的不一致行为:

有时候是对的: enter image description here

有时它错了: enter image description here

但是,当我从标签中删除内容压缩/阻力时,单元格始终是正确的高度,但看起来像这样: enter image description here

有人经历过类似的经历吗?有任何建议吗?

1 个答案:

答案 0 :(得分:1)

想出来了!

这最终与使用AutoLayout定位单元格contentView的方式有关。显然,默认情况下,它没有正确布局和计算其子视图的位置。

在我的UITableViewCell子类中,我将以下内容添加到init()

contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.leadingAnchor.constraintEqualToAnchor(leadingAnchor).active = true
contentView.trailingAnchor.constraintEqualToAnchor(trailingAnchor).active = true
contentView.topAnchor.constraintEqualToAnchor(topAnchor).active = true
contentView.bottomAnchor.constraintEqualToAnchor(bottomAnchor).active = true

通过将contentView固定到单元格,UITableViewCell不一致的高度分配问题消失了,并且始终显示正确的高度。

这导致contentView被拉伸到所有4个边缘,这会影响其他一些事情(例如UITableView编辑翻转到true时的动画),但是现在我可以通过其他方式解决这些问题,因为没有任何事情被计算为错误或正在发生意外的事情。