首先,我应该提到,这主要是一个效率问题。
关于在哪里进行框架计算有很多讨论viewWillAppear
太早了并且viewDidAppear
太晚了(视图已经可见)。
常见的答案是进行帧计算viewDidLayoutSubviews
。问题是,它被多次调用。更糟糕的是,最准确的调用(所有帧都有其最终大小的调用)是最后一个。据我所知,没有办法知道哪一个调用是最后一个调用。
我们使用一个“framesAreSet”标志(初始化为 false)和一个检查,如果框架不为零(类似于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
}
}
这看起来不错,但事实上,这是一张类似的支票self.view.frame.size.width != 0
does not保证框架确实已设置。事实是viewDidLayoutSubviews
将在表明某些帧未设置为最终状态后被调用。
如果有一个就太好了viewCompleteLayoutSubviews
。当所有帧都已设置且视图尚不可见时,完成“一次性”帧计算的最佳方法是什么?
(这可能是观点的问题not使用 NSConstraints)
该应用程序仅获得一个didLayoutSubviews
每次绘制(到目前为止,视图状态更改仅用setNeedsLayout
)。从这个意义上说,didLayoutSubviews
is你的想法didCompleteLayoutOfSubviews
。绘制之后,如果再次发生视图状态更改,则布局再次不完整。
换句话说,didLayout 调用的数量并不取决于子视图添加或框架更改的数量,它取决于绘制的数量(不要与运行循环混淆)。在绘制之前,如果已经设置了needsLayout标志,则无论视图层次结构被重新排列多少,layoutSubviews和didLayoutSubviews都将被调用一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)