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
时调整大小。但这对于您的目的可能为时已晚。 您 正在寻找的事件可能是viewWillLayoutSubviews
或viewDidLayoutSubviews
。以后会调用很多次,所以如果此时只想修改一次,可以使用布尔标志:
var didSetUp = false
override func viewDidLayoutSubviews()
super.viewDidLayoutSubviews()
if self.didSetUp return
self.didSetUp = true
// ... do stuff ...
【讨论】:
但是,我不喜欢这样的声音:“我需要根据视图的宽度构造一些 NSLayoutConstraints”。如果你认为你需要知道视图的宽度来构建你的布局约束,那你就错了!布局约束的全部意义在于您不需要知道任何实际数字,因为一切都由关系决定。 要正确地将水平分页构建成具有自动布局的UIScrollView
,您需要知道视图。以上是关于UIViewController 的视图未由 viewWillAppear() 调整大小 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式布局视图时 UIViewController 中的前 20px 填充