定位导航栏顶部的安全区域
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
【讨论】:
以上是关于定位导航栏顶部的安全区域的主要内容,如果未能解决你的问题,请参考以下文章