具有自动布局的UIPageViewController在viewDidAppear之前不会更新子帧

时间:2017-10-04 22:50:45

标签: ios swift uiviewcontroller frame

我有一个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的多个子视图组成。

问题

由于某些原因,当滚动浏览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 个答案:

答案 0 :(得分:0)

similar question

中找到我的答案

必须使用自动布局引擎及其启动时间。 viewWillAppear和viewDidAppear之间的框架是正确的,这使得我将框架特定代码放在viewDidLayoutSubviews中。

但是,如果在viewDidLayoutSubviews中调用的帧特定任务很重(例如与UI相关),则滚动中会出现滞后/闪烁。