这可能听起来像一个愚蠢的问题,但我在iOS开发中的大部分经验都是围绕着突出的自动布局,我现在很好奇(出于性能目的)我如何在没有自动布局的情况下布局一个单元格,而只使用框架(也许是自动调整大小的蒙版)。事实证明,由于自动布局的突出,这对谷歌来说非常困难。
基本上我设置和添加UITableViewCell
子类的initWithStyle
方法的子视图?
定位明智,我只是依靠bounds
的contentView
,然后如果我想要一个视图旁边的另一个视图,我基本上会做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()
。
祝你好运!