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

标签 ios swift uinavigationbar statusbar uipageviewcontroller

我有一个 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 在转换过程中的行为方式后,我能够很好地了解这里发生的情况。

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

enter image description here

  • 转换完成后,状态栏的空间会添加, 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/

    相关文章:

    ios - 如何添加到 XML 文件的链接?

    ios - 子类化与协议(protocol)

    ios - 设置导航项标题问题.. 为什么我的导航项看起来很多?

    ios - UINavigationBar 不会扩展或扩展到设备宽度

    iOS Autolayout - 在半透明导航栏下方正确定位 View

    objective-c - 在 UITableView 中自定义索​​引/部分栏的字体/背景颜色

    ios - UIImageView 闪烁动画

    ios - 清除配置文件并重新启动后无法运行临时应用程序

    swift - 如何在 Podfile 中为每个 Pod 设置 Legacy Swift 版本

    view - Xcode6/Swift - 如何在多个 View Controller 中实现 iAdBannerView?