我来自这个很棒的答案:
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
我已经实现了该答案中描述的内容,但我面临的情况略有不同。我没有一个UILabel
,而是我有UILabel
的动态列表。
我已经创建了一个图像,显示了表视图应该看起来的一些不同情况:
在回购的当前状态下,细胞不会垂直生长以适合细胞的contentView
。
更新
REPO:https://github.com/socksz/DynamicHeightCellAutoLayout
如果您尝试从repo获取项目并运行它,您可以确切地看到我所指的问题是什么。我无法得到让它失效的东西。
答案 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)
设置行高的自动尺寸&估计行高,确保执行以下步骤,自动尺寸对单元格/行高度布局有效。
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中的标签实例