以编程方式使用安全区域布局

由于我不使用故事板创build我的意见,我想知道是否有编程或类似的“使用安全区指南”选项。

我试图把我的观点固定下来

view.safeAreaLayoutGuide

但是它们在iPhone X模拟器中保持了重叠。

以下是示例代码(参考: 安全区域布局指南 ):
如果您在代码中创build约束,请使用UIView的safeAreaLayoutGuide属性来获取相关的布局锚点。 让我们在代码中重新创build上面的Interface Builder示例,以查看它的外观:

假设我们在视图控制器中拥有绿色视图作为属性:

 private let greenView = UIView() 

我们可能有一个函数来设置从viewDidLoad调用的视图和约束:

 private func setupView() { greenView.translatesAutoresizingMaskIntoConstraints = false greenView.backgroundColor = .green view.addSubview(greenView) } 

通常使用根视图的layoutMarginsGuide创build前导和尾随边距约束:

  let margins = view.layoutMarginsGuide NSLayoutConstraint.activate([ greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor), greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor) ]) 

现在,除非您只针对iOS 11,否则您需要使用#available包装安全区域布局指南约束,并回退到早期iOS版本的顶部和底部布局指南:

 if #available(iOS 11, *) { let guide = view.safeAreaLayoutGuide NSLayoutConstraint.activate([ greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0), guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0) ]) } else { let standardSpacing: CGFloat = 8.0 NSLayoutConstraint.activate([ greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing), bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing) ]) } 

结果:

在这里输入图像说明

在这里输入图像说明

这里是苹果开发者官方文档的安全区域布局指南

需要安全区来处理iPhone-X的用户界面devise。 以下是如何使用安全区域布局deviseiPhone-X用户界面的基本指南

我实际上使用它的扩展和控制是否是ios 11或不。

 extension UIView { var safeTopAnchor: NSLayoutYAxisAnchor { if #available(iOS 11.0, *) { return self.safeAreaLayoutGuide.topAnchor } else { return self.topAnchor } } var safeLeftAnchor: NSLayoutXAxisAnchor { if #available(iOS 11.0, *){ return self.safeAreaLayoutGuide.leftAnchor }else { return self.leftAnchor } } var safeRightAnchor: NSLayoutXAxisAnchor { if #available(iOS 11.0, *){ return self.safeAreaLayoutGuide.rightAnchor }else { return self.rightAnchor } } var safeBottomAnchor: NSLayoutYAxisAnchor { if #available(iOS 11.0, *) { return self.safeAreaLayoutGuide.bottomAnchor } else { return self.bottomAnchor } } } 

我正在使用这个代替在layoutMarginsGuide中添加前后页边距约束:

 UILayoutGuide *safe = self.view.safeAreaLayoutGuide; yourView.translatesAutoresizingMaskIntoConstraints = NO; [NSLayoutConstraint activateConstraints:@[ [safe.trailingAnchor constraintEqualToAnchor:yourView.trailingAnchor], [yourView.leadingAnchor constraintEqualToAnchor:safe.leadingAnchor], [yourView.topAnchor constraintEqualToAnchor:safe.topAnchor], [safe.bottomAnchor constraintEqualToAnchor:yourView.bottomAnchor] ]]; 

还请检查从Krunal的答案更低版本的ios 11的选项。

SafeAreaLayoutGuideUIView属性,

safeAreaLayoutGuide的顶部指示视图的未遮挡顶部边缘(例如,不在状态栏或导航栏后面,如果存在的话)。 同样的其他边缘。

使用safeAreaLayoutGuide避免我们的对象从圆angular,导航栏,选项卡栏,工具栏和其他祖先视图剪切/重叠。

我们可以分别创buildsafeAreaLayoutGuide对象和设置对象约束。

肖像+风景约束是 –

肖像图像

景观图像

  self.edgesForExtendedLayout = []//Optional our as per your view ladder let newView = UIView() newView.backgroundColor = .red self.view.addSubview(newView) newView.translatesAutoresizingMaskIntoConstraints = false if #available(iOS 11.0, *) { let guide = self.view.safeAreaLayoutGuide newView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true newView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true newView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true newView.heightAnchor.constraint(equalToConstant: 100).isActive = true } else { NSLayoutConstraint(item: newView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 0).isActive = true NSLayoutConstraint(item: newView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true NSLayoutConstraint(item: newView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true newView.heightAnchor.constraint(equalToConstant: 100).isActive = true } 

UILayoutGuide

safeAreaLayoutGuide

对于那些使用SnapKit的人来说 ,就像我一样,解决scheme是将约束条件锚定到view.safeAreaLayoutGuide如下所示:

 yourView.snp.makeConstraints { (make) in if #available(iOS 11.0, *) { //Bottom guide make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottomMargin) //Top guide make.top.equalTo(view.safeAreaLayoutGuide.snp.topMargin) //Leading guide make.leading.equalTo(view.safeAreaLayoutGuide.snp.leadingMargin) //Trailing guide make.trailing.equalTo(view.safeAreaLayoutGuide.snp.trailingMargin) } else { make.edges.equalToSuperview() } }