我如何布局一个UITableViewCell只用帧(没有自动布局)



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

基本上我设置和添加UITableViewCell子类的initWithStyle方法的子视图?

定位明智,我只是依靠boundscontentView,然后如果我想要一个视图旁边的另一个视图,我基本上会做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默认设置为320的最大宽度,我建议你使用主屏幕的框架。

自动布局是我们的朋友,可以节省我们很多时间。

如何重新定位单元格?

如果你打算通过编程来实现,你需要在旋转后设置视图的新高度和宽度。

调用tableView.reloadData()来更新单元格中的视图并不昂贵,这就是它的工作方式。我们别无选择,只能接受现实。

那么最好在viewDidLayoutSubViews中编写框架计算部分

我不太明白你的问题。请让我知道这是否有意义:

添加子视图

以编程方式添加子视图,实际上最好在layoutSubviews的重写中这样做,通过检查contentView是否已经添加了子视图,并在需要时调用一个方法来添加它们。这样,你可以通过storyboard/nib或使用initWithStyle加载表格单元格。或者,你可以使用在initWithCoder和initWithStyle中调用的共享commonInit方法。

子视图布局

要以编程方式布局子视图,您可以覆盖layoutSubviews(并记住调用super)并在该方法中设置帧。这个方法将在视图改变大小(旋转、初始显示等)时被调用,并且总是包含内容视图的当前边界。要计算子视图帧,你可以按照你建议的那样做,但是你需要定义子视图帧,然后为视图设置帧:

frameB.origin.x = CGRectGetMaxX(viewA.frame) + spacing;
viewB.frame = frameB;

请记住,这将为frameB的宽度校正。因此,您可能需要考虑使用CGRectDivide()

滚动性能也就是说,当在表视图单元格中使用自动布局时,最大的性能影响不是自动布局本身,而是在同一组数据上多次进行的计算来布局它-所有这些都在主线程上。比如计算所有文本的帧来布局一堆标签,或者使用drawRect而不是在后台线程上绘制图像位图,然后在绘制完成后将图像加载到UIImageView中。在不知道所显示的数据的情况下,很难猜测导致性能问题的原因,但是您应该确保使用分析来确定是否确实在提高性能。此外,您可能需要考虑将一些数字处理和/或图像渲染转移到后台线程中。

祝你好运!

最新更新