首先,我应该提一下,这主要是一个效率问题。
有很多关于在哪里进行帧计算的讨论,其中 viewWillAppear
太早而 viewDidAppear
太晚( View 已经可见)。
常见的答案是在 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
}
}
这看起来不错,但实际上,检查类似 self.view.frame.size.width != 0
的内容不保证确实设置了框架. viewDidLayoutSubviews
将在之后调用的事实表明某些框架未设置为其最终状态。
如果有一个 viewCompleteLayoutSubviews
就好了。当所有帧都已设置且 View 尚不可见时,关于完成“一次性”帧计算的最佳方法有什么想法吗?
(这可能是 View 不使用 NSConstraints 的问题)
最佳答案
应用程序每次绘制仅获得一个 didLayoutSubviews
(到那时, View 状态更改仅通过 setNeedsLayout
记录)。从这个意义上说,didLayoutSubviews
是您对didCompleteLayoutOfSubviews
的想法。绘制后,如果再次发生 View 状态更改,则布局再次不完整。
换句话说,didLayout 调用的次数不依赖于 subview 添加或帧更改的次数,它取决于绘制的次数(不要与运行循环混淆)。在绘制之前,如果设置了 needsLayout 标志,layoutSubviews 和 didLayoutSubviews 将被恰好调用一次,无论 View 层次结构重新排列了多少。
关于ios - `viewDidLayoutSubviews` 中的帧计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33942215/