原文:Safe Area Layout Guide

Apple在iOS 7中引入了topLayoutGuidebottomLayoutGuide作为UIViewController属性。它们允许您创建约束,以保持内容不被状态,导航或标签栏等UIKit栏隐藏。 这些布局指南在iOS 11中已被弃用,并被单个安全区域布局指南所取代。

Top and Bottom Layouts Guides - 概述

使用嵌入在导航控制器和标签栏中的视图控制器使用顶部和底部布局指南的示例:

绿色内容视图对顶部布局指南的底部锚点具有顶部约束,并且对底部布局指南的顶部锚点具有底部约束。 布局指南适应各种条的存在和尺寸。

Safe Area Layout Guide

iOS 11中的新功能,苹果正在弃用顶部和底部的布局指南,并将其替换为单个安全区域布局指南:

我们的约束现在是安全区域布局指南的顶部和底部锚点。 这不是一个很大的变化,但我认为这更容易理解。 您还可以方便地访问安全区域的宽度,高度和中心的布局锚点。

迁移故事板

如果您在故事板中创建约束,Apple已尝试自动化Xcode 9中的更改。 下面是我在Xcode 8中为前面的例子创建的约束:

顶部和底部布局指南的约束具有标准间距常数以创建一些填充:

我不知道将来会不会改变,但是在使用Xcode 9 beta 2编写文件时,您将不会收到弃用警告,直到您将部署目标更改为iOS 11.0。

苹果在WWDC 2017 Session 412中告诉我们,使用安全区域的故事板可向后部署。 这意味着即使您仍然针对iOS 10及更早版本,您也可以在Interface Builder中切换到使用安全区域布局指南。

您可以通过更改故事板文件检查器中的设置,将顶部和底部布局指南转换为安全区域布局指南。 您需要为您的项目中的每个故事板执行此操作。

故事板自动将顶部和底部布局指南替换为安全区域,并更新约束:

缺少间距(注:constraints to margins无效)

不幸的是,迁移不是没有问题。 对安全区布局指南的约束似乎不符合标准间距。检查约束表示为具有标准间距:

但是当布局运行时, 标准间距失效了

这似乎是Interface Builder中的一个错误( rdar:// 32970194 ),因为它不允许您使用“标准”间距为安全区域布局指南创建约束。 解决方法是手动将缺少的间距添加到顶部和底部约束:

希望Apple在未来的更新中修复这一点,因为手动修复这个更大的项目将是痛苦的。

在代码中创建约束

如果您在代码中创建约束,请使用UIViewsafeAreaLayoutGuide属性来获取相关的布局锚点。 让我们在代码中重新创建上面的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 , *) {
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)
])
}

笔记:

  • safeAreaLayoutGuideUIView的属性,其中topLayoutGuidebottomLayoutGuideUIViewController属性。 iOS 11的beta种子在UIViewController上也有一个safeAreaLayoutGuide属性,但不推荐使用。
  • constraintEqualToSystemSpacingBelow方法在iOS 11中是新的,并且不需要硬编码标准间距。 还有小于或大于版本。 对于水平间距也有constraintEqualToSystemSpacingAfter 。
  • 如果您有自定义工具栏,则可以使用UIViewController上的additionalSafeAreaInsets属性来增加安全区域的大小。

更多细节

Safe Area Layout Guide的更多相关文章

  1. xcode9报错 Safe Area Layout Guide before iOS9.0

    运行工程的时候会遇到  Safe Area Layout Guide before iOS9.0 这是因为xcode9  storyboard的设置里面多了 个 Safe Area Layout Gu ...

  2. Xcode 9.0 报错, Safe Area Layout Guide Before IOS 9.0

    Xcode 9.0 新建工程报错 xcode Safe Area Layout Guide Before IOS 9.0 如下图,在Builds for 选择iOS9.0 and Later,不勾选U ...

  3. Safe Area Layout Guide before iOS 9.0

    今天使用Xcode9.1重建项目,什么都没写运行报错:Safe Area Layout Guide before iOS 9.0!目前为止,不晓得原因,现记录解决方法:

  4. Xcode9出现错误safe area layout guide before ios 9 真正解决办法

    网上很多解决办法瞎扯淡,以讹传讹之势愈演愈烈. 正解是选中控制器,右边面板的Builds for 选择iOS9.0 and Later,如下图红框广为流传的错解是不勾选Use Safe Area La ...

  5. xcode升级至9.0之后,新建xib报错: Safe Area Layout Guide Before IOS 9.0

    直接翻译是:iOS 9.0前安全区域布局指南. 字面意思就是safe area布局应用在iOS 9之前的版本上了. 解决方法: 1,我们可以把safe area勾掉,不用safe area布局,如下图 ...

  6. Xcode 9.0 报错,Safe Area Layout Guide Before IOS 9.0

    解决方案就是: 第一步 第二步 第三步 重新编译.

  7. iOS---------- Safe Area Layout Guide before iOS 9.0

    如果你们的项目不做iOS9以下支持就打开main.storyboard    去除Use safe Area Layout 如果不考虑iOS9以下支持就按照下面的步骤 选中控制器,右边面板的Build ...

  8. 【转】最近很火的 Safe Area 到底是什么

    iOS 7 之后苹果给 UIViewController 引入了 topLayoutGuide 和 bottomLayoutGuide 两个属性来描述不希望被透明的状态栏或者导航栏遮挡的最高位置(st ...

  9. iOS开发-LayoutGuide(从top/bottom LayoutGuide到Safe Area)

    iOS7 topLayoutGuide/bottomLayoutGuide 创建一个叫做LayoutGuideStudy的工程,我们打开看一下Main.storyboard: storyboard-t ...

随机推荐

  1. 鸟瞰spring

    一.spring框架概述: Spring框架主要提供了Ioc容器.AOP.数据访问.Web开发.消息.测试等相关技术的支持. 1.Spring的模块 1)核心容器 Spring-Core:核心工具类, ...

  2. Javaweb分页功能简单实现

    效果如下图 数据库中的数据                                                                页面效果 首先,创建一个通用类Page,代码及 ...

  3. jquery的2.0.3版本源码系列(3):96行-283行,给JQ对象,添加一些方法和属性

    jquery是面向对象的程序,面向对象就离不开方法和属性. 方法的简化 jQuery.fn=jQuery.prototype={ jquery: 版本 constructor: 修正指向问题 init ...

  4. java实现邮箱找密码

    SMTP,POP3,IMAP POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电 ...

  5. 点击grid单元格弹出新窗口

    实现功能:点击指定单元格后会弹出新窗口,并且最后一行合计不会触发单元格触发函数 <script type="text/javascript"> grid.on('cel ...

  6. macaca 测试web(3)

    上回书说到 macaca 测试web(2)  使用ddt做参数驱动化, 有些人会说,你好low,我说怎么low呢,他说你看看你的脚本就放在一个文件里,对于我们小白来说,这看起来很乱啊,能不能给我拆分, ...

  7. jdk不同版本对String拼接的优化分析

    1. 测试demo代码 测试循环中字符串拼接优化 public class ForTest { public static void main(String[] args) { String a = ...

  8. C#连接Firebird方法

    Firebird Data Provider For .NET 连接 Firebird 数据库文件 下载 Firebird 嵌入式数据库:Firebird-2.5.0.25920-0_Win32_em ...

  9. C++中4个类型转换相关的关键字/特点/应用场合

    reinterpret_cast是C++里面的一个强制类型转换符,能够将任何的指针类型转换成其他的任何指针类型:能够将任何的整数类型转换成指针类型,反之亦然:滥用reinterpret_cast强制类 ...

  10. 关于本地代码挂载到vm虚拟环境下运行

    第一步: 首先你得装个 VM 虚拟机  然后新建一个Linux虚拟环境(建议CentOS镜像)(PS:至于安装此处就省略.....) 第二步:启动虚拟机配置 lnmp (这里我们可以使用 lnmp的 ...