我有一个 UIPageViewController
子类,它允许用户从初始 View Controller 向上滑动到第二个 View Controller 。第一个 View Controller 没有导航栏(它没有连接到 UINavigationController
),但第二个 View Controller 有。目前,当我向上滑动以显示第二个 View Controller 时,导航栏中没有用于状态栏的空间。转换完成后,整个 View Controller 布局立即更新以添加状态栏空间。我想让第二个 View Controller 预期状态栏将在那里并为其添加空间,以便 View 在转换后不会摇晃。
Short video clip showing the jolt
Similar, but unanswered question
编辑:
仔细观察 View Controller 在转换过程中的行为方式后,我能够很好地了解这里发生的情况。
- 当我向上滑动时,第二个 View Controller 向上移动并将导航栏(无状态栏)的顶部边缘与屏幕顶部对齐。内容的大小/布局似乎是正确的,因此底部有空白,即状态栏的高度。看截图:
- 转换完成后,状态栏的空间会添加, View 会向下移动。
最佳答案
我找到了一个似乎效果很好的解决方法。我需要用 iPhone X 进行测试,看看是否需要进行调整。如果有人找到更好的解决方案,我会将其作为可接受的答案。
加载时我基本上将页面 View Controller 向下移动 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()
}
转换后,我将页面 View Controller 移回其原始位置,同时第二个 View Controller 添加状态栏空间。这会导致第二个 View Controller 滑到状态栏的正下方,也就是它应该在的位置。没有明显的晃动。我在页面 View Controller 的委托(delegate)中使用了它:
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()
}
}
关于ios - 强制导航栏为状态栏添加空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51594010/