`viewDidLayoutSubviews`中的帧计算

bau*_*sic 5 ios ios9

首先,我要提一下,这主要是效率问题.

有很多讨论关于在哪里进行帧计算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的视图的问题)

dan*_*anh 2

该应用程序didLayoutSubviews每次绘制仅获得一次(到目前为止,视图状态更改仅用 标注setNeedsLayout)。从这个意义上说,didLayoutSubviews 你的想法didCompleteLayoutOfSubviews。绘制之后,如果再次发生视图状态更改,则布局再次不完整。

换句话说,didLayout 调用的数量并不取决于子视图添加或框架更改的数量,它取决于绘制的数量(不要与运行循环混淆)。在绘制之前,如果已经设置了needsLayout标志,则无论视图层次结构被重新排列多少,layoutSubviews和didLayoutSubviews都将被调用一次。

  • 我认为你的理解不太正确。didLayout 调用的数量不取决于子视图添加或框架更改的数量,它取决于绘制的数量(不要与运行循环混淆)。在绘制之前,如果设置了needsLayout标志,则无论视图层次结构被重新排列多少,layoutSubviews和didLayoutSubviews都将被调用一次。 (2认同)