ios - `viewDidLayoutSubviews` 中的帧计算

标签 ios ios9

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

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

相关文章:

ios - Universal Link 打开错误的包 ID

ios - 带有 displaySearchBarInNavigationBar 的 UISearchDisplayController 使用 navigationBar.translucent = false 将结果 View 向下推

ios - 如何以编程方式触发 UIButton 操作

android - Google Analytics iOS SDK "1 second sessions"(可能是后台 session ?)

ios - iOS 9 iPad Slide Over 和 Split View 中的状态栏颜色错误

ios - 云上的 HAP 将如何工作?

ios - 重大位置变化 - 我们有什么保证?

ios - 如何检测iOS屏幕是OLED?

ios - Swift:如何使用 CLLocationCoordinate2D 将坐标存储为字符串或整数?

ios - 如何在 Storyboard 中的按钮上实现这种布局?