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))
}
}
我正在使用嵌入 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))
}
}