繁体   English   中英

强制导航栏为状态栏添加空间

[英]Force the navigation bar to add space for the status bar

我有一个UIPageViewController子类,该子类允许用户从初始视图控制器向上滑动到第二个视图控制器。 初始视图控制器没有导航栏(未连接到UINavigationController ),但是第二个没有。 当前,当我向上滑动以显示第二个视图控制器时,状态栏中的导航栏中没有空间。 过渡完成后,整个视图控制器布局将立即更新以添加状态栏空间。 我想让第二个视图控制器预期状态栏将在那里,并为其添加空间,以便视图在过渡后不会摇动。

显示震撼的短片

类似但未回答的问题

编辑:

在仔细研究了视图控制器在过渡期间的行为方式之后,我能够很好地了解这里发生的情况。

  1. 当我向上滑动时,第二个视图控制器将向上移动,并将导航栏(无状态栏)的上边缘与屏幕顶部对齐。 内容的大小/布局似乎是正确的,因此底部的空白是状态栏的高度。 看截图:

在此处输入图片说明

  1. 过渡完成后,将添加状态栏的空间,并且视图向下移动。

我发现了一种似乎很好用的解决方法。 我需要使用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()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM