定位导航栏顶部的安全区域

Posted

技术标签:

【中文标题】定位导航栏顶部的安全区域【英文标题】:Position Navigation Bar top of the safe area 【发布时间】:2018-12-04 06:40:06 【问题描述】:

我升级到新 iPhone 并升级我的应用程序。我在 x/xr/xs 布局中添加了,所以现在黑色边框消失了。

我的视图顶部有一个导航栏,但现在它进入状态栏太多了?我该如何解决?以编程方式而不是情节提要(学习代码)。

一些代码:

func buildTopbar()

    statusbar = UIView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 20));

    statusbar.backgroundColor = UIColor(red: 247/255, green: 247/255, blue: 247/255, alpha: 1.0);

    navigationbar = UINavigationBar(frame: CGRect(x: 0, y: 20, width: self.view.bounds.width, height: 44));

    navigationbar.barTintColor = UIColor(red: 247/255, green: 247/255, blue: 247/255, alpha: 1.0);

    let texta = UIBarButtonItem(title: "A", style: .plain, target: self, action: #selector(settingToolbar(sender:)));
    let textb = UIBarButtonItem(title: "B", style: .plain, target: self, action: #selector(inviteToolbar(sender:)));

    texta.tintColor = ColorHelper.primaryColor();
    textb.tintColor = ColorHelper.primaryColor();

    ...

    navigationbar.setItems([title], animated: false);

    self.view.addSubview(statusbar);
    self.view.addSubview(navigationbar);

我将状态栏设置为 20,这是旧手机中的状态。

【问题讨论】:

好的,你用的是自动布局还是自动调整大小 用代码编辑了我上面的帖子 【参考方案1】:

我建议创建一个 UINavigationController 并将您的控制器添加到该导航控制器,它会自动调整导航栏。

如果您想手动添加导航栏。 您必须正确设置它的框架 Y 位置。

计算导航栏的起始Y位置

let startingYPos = UIApplication.sharedApplication.statusBarFrame.size.height;
navigationbar = UINavigationBar(frame: CGRect(x: 0, y: startingYPos, width: self.view.bounds.width, height: 44));

【讨论】:

【参考方案2】:

我的建议是为顶部添加一些约束。并根据您的 iPhone 设备尺寸或 ios 版本设置约束值。最近我通过这样的设置实现了它。我的问题是 iOS 版本,我的视图靠近状态栏。所以我以编程方式设置了一些约束并进行了处理。这样就不会影响iphone 7以下的iphone屏幕了。

In Viewdidload()
     if #available(iOS 11, *)  
            
            else
                topConstraints.constant = 20
            

在这里我检查了版本。您还可以检查设备并设置约束。如果您想进行设备检查,请告诉我。

希望能成功!!

【讨论】:

【参考方案3】:

状态栏的高度现在从 20pt 更改为 44pt(从 iPhone X 开始)。如果您想使用现有代码,则需要应用特定于设备的状态栏高度检查。

这里有一篇文章更详细地解释了导航栏布局(适用于 iPhone X 和更高版本的设备):

What is the top bar height of iPhone X?

【讨论】:

【参考方案4】:

我建议您采用 UIScreen 高度并将其置于一个条件:

if UIScreen.main.bounds.size.height > 750 
        navigationBar  = UINavigationBar(frame: CGRect(x: 0, y: 43, width: view.frame.size.width, height: 44))
    
    else
        navigationBar  = UINavigationBar(frame: CGRect(x: 0, y: 20, width: view.frame.size.width, height: 44))
    

如果您的视图具有滚动视图并且其高度设置为大于默认值,则可能无法正常工作,然后尝试:-

view.bounds.size.height

【讨论】:

【参考方案5】:

即使没有UINavigationController 或一些“神奇”的固定高度常量,您也可以让它与安全区域对齐。

    您应该有导航栏的@IBOutlet(如果导航栏是通过编程方式制作的,则为参考)。此外,将栏的顶部约束保持在安全区域。

    使您的 ViewController 符合 UINavigationBarDelegate 并设置导航栏的委托 (navigationBar.delegate = self)

    实现这个函数并返回.topAttached:

func position(for bar: UIBarPositioning) -> UIBarPosition return .topAttached

【讨论】:

以上是关于定位导航栏顶部的安全区域的主要内容,如果未能解决你的问题,请参考以下文章

位置导航栏顶部的安全区域

安全区域和导航栏

导航栏下的 UICollectionView,但标签栏下没有

在标签栏控制器中嵌入导航控制器会更改视图控制器的安全区域

顶部安全区域约束动画

小程序自定义导航栏仿原生固定在顶部