UITableViewCell +动态高度+自动布局

时间:2013-12-15 18:17:16

标签: ios uitableview autolayout uilabel row-height

我来自这个很棒的答案:
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

我已经实现了该答案中描述的内容,但我面临的情况略有不同。我没有一个UILabel,而是我有UILabel的动态列表。

我已经创建了一个图像,显示了表视图应该看起来的一些不同情况:

enter image description here

在回购的当前状态下,细胞不会垂直生长以适合细胞的contentView


更新

REPO:https://github.com/socksz/DynamicHeightCellAutoLayout

如果您尝试从repo获取项目并运行它,您可以确切地看到我所指的问题是什么。我无法得到让它失效的东西。

2 个答案:

答案 0 :(得分:2)

这里的问题是您正在使用的第三方组件FXLabel,而不是表格视图中的任何代码或其中的自动布局。为了支持自动布局,UIView的自定义子类必须适当地实现-[intrinsicContentSize]方法,然后在更改内容时调用-[invalidateIntrinsicContentSize]

在这种情况下,FXLabel似乎依赖于其超类实现(UILabel)来实现上述方法,并且因为UILabel不是以FXLabel实现它的方式处理可变行间距,所以它不知道正确的要返回的intrinsicContentSize,因此自动布局计算是错误的(在这种情况下,因为内在内容大小太小)。有关详细信息,请查看this excellent obcj.io article的“为自动布局启用自定义视图”部分。

现在好消息是,从iOS 6开始,您应该可以使用标准UILabel中的属性字符串来完成此操作。查看Stack Overflow answer here

如果由于某种原因你真的喜欢FXLabel,也许你可以在GitHub项目上打开一个问题(或者尝试自己修复并提交拉取请求)。

答案 1 :(得分:1)

设置行高的自动尺寸&估计行高,确保执行以下步骤,自动尺寸对单元格/行高度布局有效。

  • 分配并实施dataSource和委托
  • UITableViewAutomaticDimension分配给rowHeight& estimatedRowHeight
  • 实施委托/数据源方法(即heightForRowAt并向其返回值UITableViewAutomaticDimension

-

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Don't forget to set dataSource and delegate for table
    table.dataSource = self
    table.delegate = self

    // Set automatic dimensions for row height
    // Swift 4.2 onwards
    table.rowHeight = UITableView.automaticDimension
    table.estimatedRowHeight = UITableView.automaticDimension


    // Swift 4.1 and below
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension

}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Swift 4.2 onwards
    return UITableView.automaticDimension

    // Swift 4.1 and below
    return UITableViewAutomaticDimension
}

用于UITableviewCell中的标签实例

  • 设置行数= 0(& line break mode = truncate tail)
  • 相对于其superview / cell容器设置所有约束(顶部,底部,右侧)。
  • 可选:如果您希望标签覆盖最小垂直区域,即使没有数据,也可以设置标签的最小高度。

enter image description here