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

时间:2015-09-19 00:24:58

标签: uinavigationcontroller ios9

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

问题在于,当调用视图控制器的viewWillAppear方法时,其框架尚未调整到导航控制器的大小,仍然是在xib文件中设置的。在viewDidAppear之前,它现在没有正确设置。

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

4 个答案:

答案 0 :(得分:11)

我也在寻找最好的解决方案。

我的临时工作是调用“viewDidLayoutSubviews”中“viewDidAppear”中的代码。这样,一旦设置了帧,我的代码就会被调用。

但是,请确保添加布尔值或其他内容,以便每次调用viewDidLayoutSubviews时都不会调用代码

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

答案 1 :(得分:0)

我也遇到了这个问题,

尝试从故事板中取消选中“从NIB调整视图大小”选项

答案 2 :(得分:0)

尝试将布局代码从viewWillAppear移至viewWillLayoutSubviews

答案 3 :(得分:0)

有点更新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()
        }
    }
}