原文: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. MSF初体验 - kali linux 入侵XP系统

    最近做某安全竞赛平台的比赛,真正开始接触Metasploit这一渗透神器,同时也是装逼神器(2333-.),下面记录一下初步使用Metasploit的过程.首先在百度百科摘录了一段关于Metasplo ...

  2. [读书笔记] 一、Spring boot项目搭建与配置文件

    读书笔记:[JavaEE开发的颠覆者 Spring Boot实战] 作者:汪云飞 从今天开始坚持读书,并记录下此读书笔记. 一,初接触 Spring boot 项目Hello world搭建 1.po ...

  3. Java开发相关命名规范

    JAVA文件命名规范 1.类命名 抽象类以 Abstract 或者 Base 开头.异常类以 Exception 作为后缀.枚举类以 Enum 作为后缀.工具类以 Utils 作为后缀(相应的包名最后 ...

  4. 基于.netstandard的权限控制组件

    基于.netstandard的权限控制组件 Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目基于 .NETStan ...

  5. POI单元格添加公式以及读取公式结果的值

    POI提供了为单元格添加条件样式的方法,但是我并没有找到获取单元格改变后样式的方法,获取到样式依旧是没有改变之前的. 比如为单元格添加条件样式用于监听单元格值是否被修改,如果单元格值被修改那么字体颜色 ...

  6. JDK+Apache+Tomcat+MySQL配置 一起来学习吧

    配置JDK1.8+Apache2.4+Tomcat8.0+mySQL5.1,网上的资料非常繁杂,花费几天时间配置成功,汇总记录. 操作系统:CentOS6.5 预先下载最新版软件: apache-to ...

  7. URI和URL的区别 一起学习呗

    一直存在很多技术上的争论,其中最为妙的恐怕就是web地址应该叫什么的问题.通常情况就是这样:有人把地址栏的内容叫"URL",这时候有些人就来劲了:"不!其实那就是URI. ...

  8. webmagic爬取渲染网站

    最近突然得知之后的工作有很多数据采集的任务,有朋友推荐webmagic这个项目,就上手玩了下.发现这个爬虫项目还是挺好用,爬取静态网站几乎不用自己写什么代码(当然是小型爬虫了~~|). 好了,废话少说 ...

  9. 7_SQL Server通过代码删除数据

    --通过代码方式删除数据select *from Employee --第一种删除方式,数据没了,表还在,id接着删除前的id继续加1delete from Employee where EmpId ...

  10. JQuery插件制作动态网页

    运用JQuery插件制作动态网页   前  言 JQuery 今天我给大家介绍一个运用JQuery插件制作的动态网页--iphone 5C 宣传页面.这个网页中运用到了fullpage.js和move ...