我有一个RootViewController,它包含两个UIViewControllers,都是用代码创建的(没有Storyboard / Nibs) .
第一个UIViewController有以下锚点:
weekView.translatesAutoresizingMaskIntoConstraints = false
weekView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
weekView.heightAnchor.constraint(equalToConstant: 100).isActive = true
weekView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
weekView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
另一个UIViewController有以下锚点:
daysViewController.view.translatesAutoresizingMaskIntoConstraints = false
daysViewController.view.topAnchor.constraint(equalTo: weekView.bottomAnchor).isActive = true
daysViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
daysViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
daysViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
这使得它固定在第一个UIViewController的底部并占据屏幕高度的其余部分(从顶部UIViewController得到-100) .
第二个UIViewController是一个自定义的UIPageViewController,它由UIViewControllers的多个子视图组成 .
The problem
出于某种原因,当滚动UIPageViewController中的页面时,每个子ViewController都具有不正确的帧高度(例如,与约束告诉它具有的高度不同) . 相反,框架高度与屏幕高度相同 .
三种不同状态下的印刷框架高度如下:
viewDidLoad PageViewController frame: (0.0, 0.0, 375.0, 667.0)
viewDidLoad ChildViewController frame: (0.0, 0.0, 375.0, 667.0)
viewWillAppear ChildViewController frame: (0.0, 0.0, 375.0, 667.0)
viewDidAppear ChildViewController frame: (0.0, 0.0, 375.0, 667.0)
我需要在viewDidLoad中使用正确的帧大小567来正确布局子视图,而不是像在viewDidAppear中那么晚 .
我怎么解决这个问题?因为现在我需要考虑到视图框架是屏幕的全高,而不是创建所有子视图时应该是567 .
1 回答
在similar question找到我的答案
与自动布局引擎和它启动时有关 . viewWillAppear和viewDidAppear之间的框架是正确的,这使得我将框架特定代码放在viewDidLayoutSubviews中 .
但是,如果在viewDidLayoutSubviews中调用的帧特定任务很重(例如与UI相关),则滚动中将存在滞后/闪烁 .