【问题标题】:UITableViewCell + Dynamic Height + Auto LayoutUITableViewCell + 动态高度 + 自动布局
【发布时间】:2014-01-03 01:54:05
【问题描述】:

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

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

我创建了一张图片,展示了表格视图应该是什么样子的一些不同情况:

在 repo 的当前状态下,单元格不会垂直增长以适应单元格的 contentView。


更新

回购:https://github.com/socksz/DynamicHeightCellAutoLayout

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

【问题讨论】:

  • 您现在要问的问题是具体要添加哪些约束。为了弄清楚这一点,您需要描述您希望布局如何工作的“规则”。你能解释一下“如果标签的内容太长,标签需要缩小”的意思吗?这是否意味着您希望缩小字体大小,或者每个标签只允许 1 行文本,或者什么?更重要的是,由于您正在处理表格视图单元格和行高,您是否总是希望单元格垂直增长以适应每个标签,无论有多少?
  • @smileyborg:是的,我希望细胞垂直生长以适应每个标签,无论有多少。它之所以起作用,是因为每个标签都将adjustsFontSizeToFitWidth 属性设置为YES。如果你运行过这个项目,你会发现单元格没有垂直增长以适应 contentView 很遗憾。

标签: ios uitableview autolayout uilabel row-height


【解决方案1】:

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

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

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

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

【讨论】:

  • 顺便说一下,您可以做一个简单的测试来验证问题出在 FXLabel 组件上,方法是设置默认行间距,检查 intrinsicContentSize 属性的值,然后增加行间距并重新检查intrinsicContentSize 属性的值。我敢打赌它保持不变。
  • 我不再使用 FXLabel,因为我不再需要行间距。对不起,我没有告诉你。我正在用更多细节和代码更新问题。
  • 我已经用一个显示问题的简单回购更新了问题! :D
【解决方案2】:

要设置行高和估计行高的自动尺寸,请确保按照以下步骤制作,自动尺寸对单元格/行高布局有效。

  • 分配和实现 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(&换行模式=截尾)
  • 设置与其父视图/单元格容器相关的所有约束(顶部、底部、左右)。
  • 可选:设置标签的最小高度,如果你想要标签覆盖的最小垂直区域,即使没有数据。

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 2021-10-12
    • 2017-05-29
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多