`viewDidLayoutSubviews` 中的框架计算

2024-04-05

首先,我应该提到,这主要是一个效率问题。

关于在哪里进行框架计算有很多讨论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(使用前将#替换为@)

`viewDidLayoutSubviews` 中的框架计算 的相关文章

随机推荐