我有一个UIPageViewController
子类,该子类允许用户从初始视图控制器向上滑动到第二个视图控制器。初始视图控制器没有导航栏(未连接到UINavigationController
),而第二个则有。当前,当我向上滑动以显示第二个视图控制器时,状态栏中的导航栏中没有空间。过渡完成后,整个视图控制器布局将立即更新以添加状态栏空间。我想让第二个视图控制器预期状态栏将在那里,并为其添加空间,以使视图在过渡后不会摇动。
Short video clip showing the jolt
Similar, but unanswered question
编辑:
仔细查看了视图控制器在过渡期间的行为方式后,我能够很好地了解这里发生的情况。
答案 0 :(得分:0)
我找到了一种似乎很好用的解决方法。我需要使用iPhone X进行测试,看看是否需要进行调整。如果有人找到更好的解决方案,我将使其作为公认的答案。
基本上,页面视图控制器在加载时会向下移动20pt:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let f = view.frame
view.frame = CGRect(x: 0, y: 20, width: f.size.width, height: f.size.height)
view.setNeedsLayout()
view.layoutIfNeeded()
}
过渡之后,我在第二个视图控制器添加状态栏空间的同时,将页面视图控制器又移回到了其原始位置。这将导致第二个视图控制器在状态栏的正下方滑动。没有明显的震动。我在页面视图控制器的委托中使用了此方法:
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard previousViewControllers.count > 0 else { return }
// if the transition completed and the view controller we transitioned from is the first view controller
if completed && viewControllers!.index(of: previousViewControllers.first!) == 0 {
let f = view.frame
view.frame = CGRect(x: 0, y: 0, width: f.size.width, height: f.size.height)
view.setNeedsLayout()
view.layoutIfNeeded()
}
}