iOS 9: 在 UINavigationController pushViewController 之后 viewWillAppear 中不再设置框架

iOS 9: Frame no longer set in viewWillAppear after UINavigationController pushViewController

我正在尝试解决从 iOS 9 起出现的视图放置错误。我正在从 xib 文件(非自动布局)实例化视图控制器,然后将其推送到我的 UINavigationController.

问题是当view controller的viewWillAppear方法被调用时,它的frame还没有调整到navigation controller的大小,仍然是xib文件中设置的。现在直到 viewDidAppear.

才正确设置

这完全搞砸了我的代码。有谁确切知道导致这种情况发生的变化以及处理它的最佳方法是什么?我不想等到 viewDidAppear 因为这看起来很糟糕并且会导致糟糕的用户体验。

我也在寻找最佳解决方案。

我临时的一个是在"viewDidLayoutSubviews"中调用"viewDidAppear"中的代码。这样,一旦设置了框架,我的代码就会被调用。

但是,请确保添加一个布尔值或其他东西,这样您的代码就不会在每次调用 viewDidLayoutSubviews 时都被调用

-(void)viewDidLayoutSubviews{
   if (didLayoutSubviews == NO){
       didLayoutSubviews = YES;
       // perform code that was in viewWillAppear
   }
}

我也遇到过这个问题,

尝试取消选中故事板中的选项 "Resize View From NIB"

尝试将布局代码从 viewWillAppear 移动到 viewWillLayoutSubviews

稍微更新了 NickProvost 的回答:

private var loadViewToken: dispatch_once_t = 0

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    dispatch_once(&loadViewToken) { [weak self] in
        if let wSelf = self {
            wSelf.setupView()
        }
    }
}