UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]

Posted

技术标签:

【中文标题】UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]【英文标题】:UIViewController's view not resized by viewWillAppear() [duplicate] 【发布时间】:2016-05-17 23:36:40 【问题描述】:

我已经用自定义视图控制器实例化了UINavigationController。它的视图包含一个按钮,当点击该按钮时,导航控制器会将不同自定义视图控制器的视图推送到视图中:

@IBAction func showVC(sender: AnyObject) 
    let vc = MyOtherViewController()
    navigationController?.pushViewController(vc, animated: true)

MyOtherViewController's viewWillAppear() 函数中,我看到视图没有调整大小以适应视图层次结构。

override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)
    print("view: \(view)")

print() 函数的输出是:

视图:>

如您所见,此时视图的大小仍为600 x 600,即来自.xib 文件的原始大小。我没有调整 .xib 中视图的大小,因为该视图将显示在各种 iPhone 和 iPad 显示器上。

我的困境是我需要视图的最终尺寸,因为我需要根据视图的宽度构造一些NSLayoutConstraints

调整视图大小的推荐方法是什么?期望视图在调用 -viewWillAppear() 时调整大小是错误的吗?

【问题讨论】:

您可以覆盖viewWillLayoutSubviews 以获得视图的实际大小。 【参考方案1】:

期望视图在调用 -viewWillAppear() 时调整大小是错误的吗?

是的。您可以确定它将在viewDidAppear 时调整大小。但这对于您的目的可能为时已晚。 正在寻找的事件可能是viewWillLayoutSubviewsviewDidLayoutSubviews。以后会调用很多次,所以如果此时只想修改一次,可以使用布尔标志:

var didSetUp = false
override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()
    if self.didSetUp  return 
    self.didSetUp = true
    // ... do stuff ...

【讨论】:

但是,我不喜欢这样的声音:“我需要根据视图的宽度构造一些 NSLayoutConstraints”。如果你认为你需要知道视图的宽度来构建你的布局约束,那你就错了!布局约束的全部意义在于您不需要知道任何实际数字,因为一切都由关系决定。 要正确地将水平分页构建成具有自动布局的UIScrollView,您需要知道视图。

以上是关于UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式布局视图时 UIViewController 中的前 20px 填充

UIViewController 没有填满屏幕

子视图未正确定位

表的头视图下拉放大效果

将 UIViewController 的视图添加到另一个 UIViewController 的视图是不是可取?

从子视图 UIViewcontroller 到其他 UIViewController