[英]How do I layout a UITableViewCell using only frames (no Auto Layout)?
这听起来像是一个愚蠢的问题,但是我在iOS开发中的大部分经验都围绕着突出显示自动布局而着,我现在很好奇(出于性能目的)如何在没有自动布局的情况下布置单元并使用仅帧(可能还有自动调整大小的蒙版)。 事实证明,由于自动版式的重要性,这对Google来说非常困难。
本质上,我是在UITableViewCell
子类的initWithStyle
方法中设置并添加子视图吗?
明智的定位是,我是否仅依靠contentView
的bounds
,然后如果我想要一个视图在另一个视图旁边,我是否会基本上执行newView.frame.origin.x = CGRectGetMaxX(otherView.frame) + spacing
?
我旋转时会发生什么? 我知道我可以在viewWillTransitionToSize
观察旋转,但是如何重新定位单元呢? 只需调用tableView.reloadData()
既昂贵又不会做太多,因为单元格被放置在initWithStyle
,对吗?
我的目标是iOS 8+。
任何见解将不胜感激。
其实它
newView.frame.origin.x = CGRectGetMaxX(otherView.frame) + spacing + leftMargin;
// you have to include all the spacing, including margins
小费:
默认情况下,不要依赖bounds of the contentView
的bounds of the contentView
它的最大宽度设置为320
,我建议您使用主屏幕的框架。
AutoLayout是我们的朋友,可以为我们节省很多时间。
如何重新放置细胞?
如果您打算以编程方式进行此操作,则需要在旋转后设置新的视图高度和宽度。
调用tableView.reloadData()
来更新单元格中的视图并不昂贵,这就是它的工作原理。 我们别无选择,只能忍受它。
那么最好在viewDidLayoutSubViews中编写框架计算部分。
我不确定我是否理解您的问题。 请让我知道这是否有意义:
要以编程方式添加子视图,实际上最好是通过检查contentView是否已经添加了子视图,并在需要时调用一种方法来添加子视图来覆盖layoutSubviews
。 这样,您可以通过情节提要/笔尖或使用initWithStyle加载表格单元。 或者,您可以使用在initWithCoder和initWithStyle中都调用的共享commonInit
方法。
要以编程方式布局子视图,请覆盖layoutSubviews
(并记住要调用super)并在该方法中设置框架。 每当视图更改大小(旋转,初始表示等)时,都会调用此方法,并且该方法将始终包括内容视图的当前范围。 要计算子视图框架,可以按照建议的方法进行操作,但是需要定义子视图框架,然后为视图设置框架:
frameB.origin.x = CGRectGetMaxX(viewA.frame) + spacing;
viewB.frame = frameB;
并请记住,这将无法校正frameB的宽度。 因此,您可能需要考虑使用CGRectDivide()
。
就是说,在表视图单元格中使用自动布局时,最大的性能损失不是自动布局本身,而是对同一组数据进行多次计算以将其布局的计算-全部在主线程上进行。 例如,计算所有文本的框架以相对于彼此布置一堆标签,或者使用drawRect而不是在后台线程上绘制图像位图的对象,然后在完成绘制后将图像加载到UIImageView中。 在不知道要显示什么数据的情况下,很难猜测是什么导致了性能问题,但是您应该确保使用性能分析来确定您是否真正在提高性能。 此外,您可能需要考虑将一些数字运算和/或图像渲染移到后台线程上。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.