iOS 9:在UINavigationController pushViewController后,viewWillAppear中不再设置Frame

16
我正在尝试解决一个在iOS 9中出现的视图放置错误。我从xib文件(非自动布局)实例化了一个视图控制器,然后将其推送到我的UINavigationController上。
问题在于当视图控制器的viewWillAppear方法被调用时,它的框架尚未调整为导航控制器的大小,而仍然是在xib文件中设置的大小。直到viewDidAppear方法被调用才会正确设置。这完全破坏了我的代码。有没有人知道精确地发生了什么,导致了这个问题,以及处理它的最佳方法是什么?我不想等到viewDidAppear,因为这会看起来很糟糕,给用户带来不良体验。

1
我遇到了相同的问题。进一步检查发现,子视图尚未添加到 UINavigationController 的视图中(view.superview == nil)。 - Brody Robertson
4个回答

11

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

我暂时的解决方法是在"viewDidLayoutSubviews"中调用原本位于"viewDidAppear"中的代码。这样,我的代码将在框架设置完成后立即被调用。

但一定要添加一个布尔值或其他条件来确保你的代码不会在每次调用viewDidLayoutSubviews时都被执行。

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

谢谢Nick,这解决了问题!不幸的是,这是必要的。viewWillAppear之前是放置此代码的完美概念位置。现在感觉我们必须使用一个hack来做以前自然而然的事情。 :( - devios1

0

我也遇到了这个问题,

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


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

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()
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接