具有 Auto-Layout 的 UIPageViewController 在 viewDidAppear 之前不会更新子框架
UIPageViewController with Auto-Layout doesn't update childs frame until viewDidAppear
我有一个 RootViewController,它由两个 UIViewController 组成,都是在代码中创建的(没有 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,它由 UIViewController 的多个 child 视图组成。
问题
由于某种原因,在 UIPageViewController 中滚动页面时,每个 child 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。
在 similar question
中找到了我的答案
与自动布局引擎及其启动时间有关。
viewWillAppear 和 viewDidAppear 之间的框架是正确的,这让我将框架特定代码放在 viewDidLayoutSubviews 中。
但是,如果在 viewDidLayoutSubviews 中调用的框架特定任务很重(例如 UI 相关),则滚动中会出现 lag/flicker。
我有一个 RootViewController,它由两个 UIViewController 组成,都是在代码中创建的(没有 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,它由 UIViewController 的多个 child 视图组成。
问题
由于某种原因,在 UIPageViewController 中滚动页面时,每个 child 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。
在 similar question
中找到了我的答案与自动布局引擎及其启动时间有关。 viewWillAppear 和 viewDidAppear 之间的框架是正确的,这让我将框架特定代码放在 viewDidLayoutSubviews 中。
但是,如果在 viewDidLayoutSubviews 中调用的框架特定任务很重(例如 UI 相关),则滚动中会出现 lag/flicker。