gpt4 book ai didi

ios - `viewDidLayoutSubviews` 中的帧计算

转载 作者:可可西里 更新时间:2023-11-01 04:45:22 24 4
gpt4 key购买 nike

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

有很多关于在哪里进行帧计算的讨论,其中 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com