由于我不使用故事板来创建视图,我想知道是否有"使用安全区域指南"选项以编程方式或类似的方式.

我试着把我的观点固定在

view.safeAreaLayoutGuide

但它们一直在与iPhone X模拟器中的顶级产品重叠.

推荐答案

以下是示例代码(引用自:Safe Area Layout Guide):
如果您在代码中创建约束,请使用UIView的safeAreaLayoutGuide属性获取相关的布局锚点.让我们用代码重新创建上面的Interface Builder示例,看看它是什么样子:

假设我们将绿色视图作为视图控制器中的属性:

private let greenView = UIView()

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

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

一如既往地使用根视图的layoutMarginsGuide创建前导和尾随边距约束:

 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)
   ])
}

Result:

在此处输入图像描述

在此处输入图像描述


以下是苹果开发者Safe Area Layout Guide的官方文档


需要安全区来处理iPhone-X的用户界面设计.以下是How to design user interface for iPhone-X using Safe Area Layout人的基本指导方针

Ios相关问答推荐

Swift addtarget方法的默认参数不生效

Firebase SDK 10+—无法安装软件包

Swift导航远离视频导致崩溃

clang:错误:SDK 路径中不包含libarclite

flutter中实现自定义底部导航栏

如何在后台显示 Swift UI 中的通讯通知?

Flutter iOS 键盘问题:. TextInputType.number 中缺少字符

如何创建装饰视图?

RFID scanner 的蓝牙服务 UUID?

Strange UIView.animate更改UIButton标题 colored颜色 的行为

Flutter Aging Person 自定义小部件

当 Swift 枚举具有 any existential 作为其关联值之一时,我如何使它符合 `Equatable`?

使用 AVCaptureDeviceTypeBuiltInTripleCamera 时 Select 合适的相机进行条码扫描

集成 IDNow SDK 时未找到 Xcode FLAnimatedImage.h 文件问题

如何识别 SwiftUI 中点击的按钮 ID 以使该按钮动画化?

Xcode 项目格式:3.1、3.2、6.3 和 8.0 有什么区别?

在 iOS 8.1 模拟器上更改语言不起作用

SwiftUI NavigationView navigationBarTitle LayoutConstraints 问题

快速从 NSTimeInterval 转换为小时、分钟、秒、毫秒

从 Swift 转换为 Objective-c 的工具