在layoutSubviews或initWithStyle:reuseIdentifier中构建自定义UITableVi



据我所知,布局自定义表视图单元格似乎有三种方法:

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

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

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

您应该在中创建单元格子视图

- initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString*) resueIdentifier

并在layoutSubview中对其进行布局。-initWithStyle:reuseIdentifier方法在初始化时会被调用一次,但您的单元格此时可能有不正确的帧。

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

-[UIView layoutSubviews]

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

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

最新更新