iOS 11 隐藏状态栏将我的导航控制器拉到屏幕顶部

iOS 11 Hiding Status Bar pulls my Navigation Controller to the top of the screen

我正在使用嵌入 UIPageViewController 的 UINavigationController 构建应用程序。在其中一个 UIPageViewController UIViewController 中,我有一个显示照片库的按钮,当显示这个模态照片库 UIViewController 时,我隐藏了状态栏,因为照片库是全屏的:

self.present(self.photosViewController!, animated: true, completion: nil)

问题是当转换发生时(模态 UIViewController 淡入黑色背景),我可以看到我的 UINavigationController 向上移动 20px 到屏幕顶部,也就是状态栏所在的位置。

在 iOS 9.3 或 10.3 模拟器上构建时不会出现问题,仅在 iOS 11.0 模拟器上构建。

有什么方法可以防止 IUNavigationController 在隐藏状态栏时向上移动?

我所做的是子class UINavigationBar class 并在我的 UINavigationController 中使用它(在 Storyboard 中,为 Navigation Controller 下的 Navigation Bar 指定自定义 class ) :

class CustomUINavigationBar: UINavigationBar {

    override func layoutSubviews() {
        super.layoutSubviews()

        if (self.frame.origin.y == CGFloat(0)) {
            self.frame.origin.y = CGFloat(20)
        }

        for subView in self.subviews {
            if (subView.className == "_UIBarBackground") {
                subView.frame.size.height = 64
                subView.frame.origin.y = -20
            }
        }
    }

}

className属性来自:

extension NSObject {
    var className: String {
        return NSStringFromClass(type(of: self))
    }
}