iOS:向应用程序窗口添加导航栏与状态栏冲突
Posted
技术标签:
【中文标题】iOS:向应用程序窗口添加导航栏与状态栏冲突【英文标题】:iOS: Adding navigation bar to Application window collides with status bar 【发布时间】:2018-02-24 14:58:07 【问题描述】:我在应用程序窗口中添加了导航栏,但导航栏与状态栏发生冲突。 (我需要用应用程序窗口来做)。
我试过的代码是:
UIWindow * firstWindow = [UIApplication sharedApplication].windows[0];
UINavigationBar * navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, firstWindow.frame.size.width, 64)];
/*
// I tried these also
UINavigationBar * navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, firstWindow.frame.size.width, 84)];
UINavigationBar * navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 20, firstWindow.frame.size.width, 64)];
*/
[firstWindow addSubview:navBar];
结果如下:
我环顾四周并尝试了与默认导航栏相关的所有答案,但没有任何效果:
What is the height of Navigation Bar in ios 7?
iOS 10 custom navigation bar height
iOS 7 status and navigation bar different height in storyboard than in app
UINavigationBar/Status Bar issue in IOS7
When hiding the statusbar my navigation bar moves up in iOS7
iOS 7 Status Bar Collides With NavigationBar using ViewController
【问题讨论】:
为什么需要在主窗口中添加UINavigationBar
?
我需要在所有视图、屏幕和窗口之上执行一些与应用程序安全相关的操作(身份验证),以防止用户访问。我的应用程序中很少有代码已经在使用***(根)视图控制器及其窗口进行其他操作。
您需要像第一张图片中一样的导航栏吗?我的意思是状态栏背景颜色为蓝色?
84 高会怎样?
它没有变为 84。它仍然是 44..
【参考方案1】:
为 NavigationController 使用额外的SafeAreaInsets,
self.navigationController.additionalSafeAreaInsets = UIEdgeInsetsMake(20, 0, 0, 0);
【讨论】:
【参考方案2】:这就是您在 iOS 11 中使用安全区域插图的方式。您需要一个底层视图控制器,这样您至少可以在安全区域插图更新时收到通知。此代码来自 Xcode 9 中的单个应用模板。随着安全区域的更新,您可以看到纵向和横向模式之间的帧更新。
import UIKit
class ViewController: UIViewController
private var window: UIWindow!
private var navbar: UINavigationBar!
override func viewDidLoad()
super.viewDidLoad()
self.window = UIApplication.shared.windows[0]
self.navbar = UINavigationBar(frame: CGRect(x: 0, y: self.view.safeAreaInsets.top, width: window.frame.size.width, height: 64))
self.navbar.barTintColor = .red
window.backgroundColor = .gray
window.addSubview(navbar)
self.view.backgroundColor = .clear
override func viewSafeAreaInsetsDidChange()
let navBarHeight: CGFloat = 64
self.navbar.frame = CGRect(x: 0, y: self.view.safeAreaInsets.top, width: self.window.bounds.width, height: navBarHeight)
这是来自模拟器的图片:
如果您需要支持 iOS 10 及更低版本,那么您还需要使用已弃用的 topLayoutGuide。 length
属性将为您提供与安全布局指南类似的信息。
我觉得有必要补充一下,尽管找到一种使用导航控制器的方法会更容易、更安全,尤其是当您开始支持多个版本的 iOS 和 Apple 升级 UIKit 时。
【讨论】:
【参考方案3】:试试这个
CGFloat height = [UIApplication sharedApplication].statusBarFrame.size.height;
UIWindow * firstWindow = [UIApplication sharedApplication].windows[0];
UINavigationBar * navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, height, firstWindow.frame.size.width, 64)];
[firstWindow addSubview:navBar];
【讨论】:
以上是关于iOS:向应用程序窗口添加导航栏与状态栏冲突的主要内容,如果未能解决你的问题,请参考以下文章