首页 文章

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

提问于
浏览
0

我有一个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 回答

  • 0

    similar question找到我的答案

    与自动布局引擎和它启动时有关 . viewWillAppear和viewDidAppear之间的框架是正确的,这使得我将框架特定代码放在viewDidLayoutSubviews中 .

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

相关问题