【问题标题】:Where to build custom UITableViewCell: in layoutSubviews or initWithStyle:reuseIdentifier?在哪里构建自定义 UITableViewCell:在 layoutSubviews 或 initWithStyle:reuseIdentifier 中?
【发布时间】:2013-07-31 08:03:04
【问题描述】:

据我了解,布局自定义表格视图单元格的方式似乎有三种:

  1. 在界面生成器中。
  2. layoutSubviews
  3. initWithStyle:reuseIdentifier:

第二种和第三种方法有什么区别?另外,为什么不drawRect

附:我正在关注Pro iOS Table Views by Tim Duckett 本书的第 9 章,我们正在其中构建自定义 UITableViewCells。作者展示了如何以与上面相同的顺序布置单元格,但我不知道最后两个之间有什么区别,因为它们都取消了 IB。不过我注意到,作者只是在layoutSubviews 中设置了框架,这与在initWithStyle:reuseIdentifier: 中设置了有关视图外观的属性(例如,背景图像、背景颜色等)不同。

【问题讨论】:

  • 我通常会按照 iOS 食谱一书中的描述进行操作。这应该等同于initWithStyle:reuseIdentifier: 中的自定义。

标签: iphone ios objective-c ipad uitableview


【解决方案1】:

您应该在

中创建您的单元格子视图
- initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString*) resueIdentifier

并将它们布局在 layoutSubviews 中。 -initWithStyle:reuseIdentifier 方法将在初始化时调用一次,但此时您的单元格可能有错误的帧。

这就是为什么你需要在layoutSubviews方法中布局它,当单元格需要更新布局时调用它,例如,当发生自动旋转时。因此,如果您将在此方法中布局子视图,您将拥有有效的单元格框架和正确的子视图布局。

【讨论】:

  • 所以如果我只支持纵向,我不必覆盖layoutSubviews,对吗?
  • 不,你应该。即使您只有纵向,最好在该方法中定义所有布局。单元格框架在 init 方法中可能不正确(例如,如果您有单元格的自定义高度,以及许多其他情况)。并且不要忘记调用 [super layoutSubviews]:)
  • 谢谢,我按照您的提示在initWithStyle:reuseIdentifier: 中构建所有内容,但还没有覆盖layoutSubviews。我可能只是懒惰,但我认为layoutSubviews 不会在应用程序不做横向并且表格视图单元格是静态的时被调用:stackoverflow.com/a/5330162/855680。在上面引用的情况下,无论如何,tableView:heightForRowAtIndexPath: 对自定义表格视图单元格的高度拥有最终决定权。你怎么看?
  • 在您发布的答案中,有一点是当视图添加为子视图时会调用 layoutSubviews。 UITableViewCell 作为子视图添加到 UITableView。此外,此答案涉及 UIView,在您的情况下,UITableView 添加了自己的行为以及将调用 layoutSubviews 的其他位置。
【解决方案2】:
-[UIView layoutSubviews]

让您可以更好地控制视图的重新布局方式(我想在您的书示例中它是在表格单元格 contentView 中完成的)。 当您使用 NIB 文件时,您所做的只是在内存中重新创建具有某些属性集的视图层次结构,但 nib 没有重新布局单元格的动态功能(或者它仅限于 spring/struct 或自动布局功能)。如果您不使用 NIB,则必须以编程方式创建此层次结构。

特别是在表格视图单元子类中,您可以向其中添加许多可以改变单元重新布局方式的属性,例如是否显示缩略图,是否显示某个标签,在这种情况下,您可能需要 layoutSubviews 方法来更新单元格布局,同时考虑到由于不同的属性值而导致的所有可能的布局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多