强制导航栏为状态栏添加space
Force the navigation bar to add space for the status bar
我有一个 UIPageViewController
子类,允许用户从初始视图控制器向上滑动到第二个视图控制器。初始视图控制器没有导航栏(它没有连接到 UINavigationController
),但第二个有。目前,当我向上滑动以显示第二个视图控制器时,状态栏的导航栏中没有 space 。转换完成后,整个视图控制器布局立即更新以添加状态栏 space。我想让第二个视图控制器预期状态栏将在那里并为其添加 space 以便视图在转换后不会摇晃。
Short video clip showing the jolt
Similar, but unanswered question
编辑:
仔细查看视图控制器在转换期间的行为方式后,我能够很好地了解这里发生了什么。
- 当我向上滑动时,第二个视图控制器向上移动并将导航栏(无状态栏)的顶部边缘与屏幕顶部对齐。看起来内容的size/layout是正确的,所以底部的白色space就是状态栏的高度。见截图:
- 过渡完成后,space 添加状态栏,视图向下移动。
我找到了一个似乎很有效的解决方法。我需要用 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()
}
转换后,我将页面视图控制器移回其原始位置,同时第二个视图控制器添加状态栏 space。这会导致第二个视图控制器滑动到状态栏的正下方,它应该在的位置。没有明显的颠簸。我在我的页面视图控制器的委托中使用了它:
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()
}
}
我有一个 UIPageViewController
子类,允许用户从初始视图控制器向上滑动到第二个视图控制器。初始视图控制器没有导航栏(它没有连接到 UINavigationController
),但第二个有。目前,当我向上滑动以显示第二个视图控制器时,状态栏的导航栏中没有 space 。转换完成后,整个视图控制器布局立即更新以添加状态栏 space。我想让第二个视图控制器预期状态栏将在那里并为其添加 space 以便视图在转换后不会摇晃。
Short video clip showing the jolt
Similar, but unanswered question
编辑:
仔细查看视图控制器在转换期间的行为方式后,我能够很好地了解这里发生了什么。
- 当我向上滑动时,第二个视图控制器向上移动并将导航栏(无状态栏)的顶部边缘与屏幕顶部对齐。看起来内容的size/layout是正确的,所以底部的白色space就是状态栏的高度。见截图:
- 过渡完成后,space 添加状态栏,视图向下移动。
我找到了一个似乎很有效的解决方法。我需要用 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()
}
转换后,我将页面视图控制器移回其原始位置,同时第二个视图控制器添加状态栏 space。这会导致第二个视图控制器滑动到状态栏的正下方,它应该在的位置。没有明显的颠簸。我在我的页面视图控制器的委托中使用了它:
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()
}
}