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:向应用程序窗口添加导航栏与状态栏冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配导航栏与状态栏ios7

在 iOS 7 中让导航栏与状态栏重叠

让导航栏与iOS 7中的状态栏重叠

iOS11中没有状态栏的导航栏与安全区域重叠

iOS - 向应用程序窗口添加导航栏

导航栏与状态栏