首先,我要提一下,这主要是效率问题.
有很多讨论关于在哪里进行帧计算viewWillAppear太早而且viewDidAppear太晚(视图已经可见).
常见的答案是进行帧计算viewDidLayoutSubviews.问题是,它被多次调用.更糟糕的是,最准确的呼叫,即所有帧都具有最终大小的呼叫是最后一个.据我所知,没有办法知道最后一个是哪个电话.
我们使用'framesAreSet'标志(初始化为false)和一个检查,如果frame不为零(类似self.view.frame.size.width != 0),'framesAreSet'为false,则进入,转动标志并仅计算一次.就像是:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.view.frame.size.width != 0 && !framesAreSet)
{
framesAreSet = true;
//Calculate frames here
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来不错,但实际上,检查类似的东西self.view.frame.size.width != 0并不能保证确实设置了帧.viewDidLayoutSubviews将被调用的事实表明某些帧未设置为最终状态.
有一个很好的viewCompleteLayoutSubviews.当所有帧都被设置并且视图还不可见时,有什么最好的方法可以实现"一次性"帧计算?
(这可能是不使用NSConstraints的视图的问题)
该应用程序didLayoutSubviews每次绘制仅获得一次(到目前为止,视图状态更改仅用 标注setNeedsLayout)。从这个意义上说,didLayoutSubviews 是你的想法didCompleteLayoutOfSubviews。绘制之后,如果再次发生视图状态更改,则布局再次不完整。
换句话说,didLayout 调用的数量并不取决于子视图添加或框架更改的数量,它取决于绘制的数量(不要与运行循环混淆)。在绘制之前,如果已经设置了needsLayout标志,则无论视图层次结构被重新排列多少,layoutSubviews和didLayoutSubviews都将被调用一次。
| 归档时间: |
|
| 查看次数: |
970 次 |
| 最近记录: |