原文: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. IT类非开发面试总结--1

    面试总结.. ================================= 第一部分.. -------------2. 电脑开机时风扇转, 但是屏幕没有任何显示, 此现象可能是哪些方面所导致? ...

  2. myeclipse db browser 新建数据源

    Myeclipse 新建数据源 一.打开myeclipse(打开了当我没说) 二.在window选项中找到show view ,点击other,输入db,选择DB Browser 三.在DB Brow ...

  3. grep Pocket Reference读记

    1 简介 grep的基本命令格式如下:           grep [options] [regexp] [filename]   如果regexp中含有空格,应该使用单引号或双引号括起来.单引号和 ...

  4. java匿名内部类举例

    public class Test { public static void main(String[] args) { //4.匿名内部类 //主要是针对那些不能直接创建对象的抽象类和接口而来的 S ...

  5. 【 DCOS 】织云 CMDB 管理引擎技术详解

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者 : 李琦 , 腾讯高级工程师 , 就职于网络平台部.曾负责公司海量运营系统的规划设计,如 TMP.Sniper.GSLB.IDCSp ...

  6. [PSIDE]PeopleSoft PSIDE无法启动因为缺失MSVCR100.dll解决办法

    “The program can’t start because MSVCR100.dll is missing from your computer” 当开发工具是绿色版的时候,在打开PSIDE时很 ...

  7. 安装mariadb二进制程序

    author:JevonWei 版权声明:原创作品 下载mariadb软件包 https://downloads.mariadb.org/mariadb/5.5.57/ 一.创建用户和准备数据目录 1 ...

  8. pycharm远程linux开发和调试代码

    pycharm是一个非常强大的python开发工具,现在很多代码最终在线上跑的环境都是linux,而开发环境可能还是windows下开发,这就需要经常在linux上进行调试,或者在linux对代码进行 ...

  9. 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

    本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到,在init进程中内核挂接到根文件系统之后,会开始启动第一个应用程序: kernel_init函数代码如下: static int __in ...

  10. xml字符串转对象xml文件转对象

    判断是否是ie浏览器和非ie浏览器的方法有多种,在此只介绍用例中的方法: 1.解析xml字符串,得到xml对象的方式: function createXml(str){ if(document.all ...