【问题标题】:iOS Calculate Height For CelliOS计算单元格的高度
【发布时间】:2016-07-15 21:41:30
【问题描述】:

我对 Apple 的动态调整单元格大小有疑问,因此我的单元格布局的逻辑不像几个堆叠的 UILabel 那样枯燥无味。

因此,我无法真正使用他们提供的动态调整大小选项,因此我需要使用 NSString boundingRect 方法手动计算单元格的高度。

这很好 - 它可以工作,但我最终需要存储很多常量来跟踪我的自动布局约束。我觉得这与自动布局应该为我做的事情背道而驰,所以我不确定这是否是实现 heightForRowAtIndexPath 的正确方法。

我基本上必须将我的约束复制到一个常量中,然后在类方法中使用这些值来生成我的高度。 Apple 几乎没有提供关于 UITableViewAutomaticDimension 工作原理的内部见解,但很明显,单元格的高度仍然是在布局之前计算的。因此,除非我知道之前调用了哪些方法,否则我无法真正添加任何复杂的逻辑。

关于我应该做什么,或者我的方法是否可以的任何想法?

【问题讨论】:

  • “我的单元格布局的逻辑没有那么简单” - 逻辑是什么?
  • boundingRect 不是计算标签(或其他)大小的正确方法,-sizeToFit 或 -sizeThatFits: 是正确的
  • @kelin 我有两个标签。如果左标签的宽度切入右标签,则将右标签移动到左标签下方。如果左标签占用多行,也将右标签移到左标签下方。
  • @Andrea 所以我需要创建一个 UILabel 的实例来计算这个?感觉有点浪费,但如果它是正确的做法,我会去的。
  • @EricGao 问题在于使用 boundingRect 您只能获得包含文本的区域。 UILabel、textview 和 textfield 包含额外的填充,风险是你要剪掉一些字形。更多信息在这里doing-it-wrong.mikeweller.com/2012/07/… 正确的方法是让单元格只用于设置数据和获取大小的建议,缓存这些高度,一切都会正常

标签: ios objective-c uitableview


【解决方案1】:

我可以提供的常见解决方案是为您的单元格添加高度约束,并根据您的需要更改约束,无论它们是什么。 UITableViewAutomaticDimension 将自动将单元格调整为您使用此约束指定的高度。

【讨论】:

  • 是的,但是我在哪里可以修改高度限制? LayoutSubviews 调用太晚 - 单元格的高度由该点确定。如果我在初始化后立即设置它,所有子视图的框架都是错误的。
【解决方案2】:

如果您的表格单元格是自定义的,那么如果您使用类似 configureCell 的方法并将 indexPath 从 cellForRowAtIndexPath 传递给它,然后根据您拥有的数据确定布局并查看您想要左侧的位置,则更容易和要放置的正确标签。完成此操作后,存储模型中所需的高度,或者存储与表具有相同行数的另一个数组,并使用它在heightForRowAtIndexPath 中返回。

这更容易并为您提供了灵活性,而不必摆弄太多的表格视图委托方法。将您的布​​局逻辑集中在一处。 另一种选择是覆盖表格视图单元格的 layoutSubviews 并计算那里的高度并存储它。

【讨论】:

  • 谢谢,我发现原型细胞类型方法比我预期的更常见。我喜欢你描述得更好的第二种方法,但这不起作用。 layoutSubviews 是在计算高度后调用的,所以我不会及时得到高度。
  • 如果您有自定义单元格,那么您最好的选择可能是使用第一种方法。如果您想根据标签的内容重新排列标签,那么我认为您必须事先计算高度并将其返回,然后在 layoutSubviews 中,您可以根据标签的文本大小将标签向右或向下移动。你是对的,layoutSubviews 不能用于计算高度。那时高度已经确定。
【解决方案3】:

如果您希望为 tableview 单元格分配默认高度,可以使用估计的HeightForRowAtIndexPath:在 UITableViewDelegate 中可用。根据 Apple 指南:

// 使用estimatedHeight 方法快速计算猜测值,这将允许快速加载表格。 // 如果实现了这些方法,上面的 -tableView:heightForXXX 调用将被推迟到视图准备好显示,因此可以在那里放置更昂贵的逻辑。

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多