繁体   English   中英

如何仅使用框架来布局UITableViewCell(不使用自动布局)?

[英]How do I layout a UITableViewCell using only frames (no Auto Layout)?

这听起来像是一个愚蠢的问题,但是我在iOS开发中的大部分经验都围绕着突出显示自动布局而着,我现在很好奇(出于性能目的)如何在没有自动布局的情况下布置单元并使用仅帧(可能还有自动调整大小的蒙版)。 事实证明,由于自动版式的重要性,这对Google来说非常困难。

本质上,我是在UITableViewCell子类的initWithStyle方法中设置并添加子视图吗?

明智的定位是,我是否仅依靠contentViewbounds ,然后如果我想要一个视图在另一个视图旁边,我是否会基本上执行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 contentViewbounds 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM