Safe Area Layout Guide
Apple在iOS 7中引入了topLayoutGuide
和bottomLayoutGuide
作为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在未来的更新中修复这一点,因为手动修复这个更大的项目将是痛苦的。
在代码中创建约束
如果您在代码中创建约束,请使用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 , *) {
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)
])
}
笔记:
safeAreaLayoutGuide
是UIView
的属性,其中topLayoutGuide
和bottomLayoutGuide
是UIViewController
属性。 iOS 11的beta种子在UIViewController
上也有一个safeAreaLayoutGuide
属性,但不推荐使用。constraintEqualToSystemSpacingBelow
方法在iOS 11中是新的,并且不需要硬编码标准间距。 还有小于或大于版本。 对于水平间距也有constraintEqualToSystemSpacingAfter
。- 如果您有自定义工具栏,则可以使用
UIViewController
上的additionalSafeAreaInsets
属性来增加安全区域的大小。
更多细节
Safe Area Layout Guide的更多相关文章
- xcode9报错 Safe Area Layout Guide before iOS9.0
运行工程的时候会遇到 Safe Area Layout Guide before iOS9.0 这是因为xcode9 storyboard的设置里面多了 个 Safe Area Layout Gu ...
- 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 ...
- Safe Area Layout Guide before iOS 9.0
今天使用Xcode9.1重建项目,什么都没写运行报错:Safe Area Layout Guide before iOS 9.0!目前为止,不晓得原因,现记录解决方法:
- Xcode9出现错误safe area layout guide before ios 9 真正解决办法
网上很多解决办法瞎扯淡,以讹传讹之势愈演愈烈. 正解是选中控制器,右边面板的Builds for 选择iOS9.0 and Later,如下图红框广为流传的错解是不勾选Use Safe Area La ...
- xcode升级至9.0之后,新建xib报错: Safe Area Layout Guide Before IOS 9.0
直接翻译是:iOS 9.0前安全区域布局指南. 字面意思就是safe area布局应用在iOS 9之前的版本上了. 解决方法: 1,我们可以把safe area勾掉,不用safe area布局,如下图 ...
- Xcode 9.0 报错,Safe Area Layout Guide Before IOS 9.0
解决方案就是: 第一步 第二步 第三步 重新编译.
- iOS---------- Safe Area Layout Guide before iOS 9.0
如果你们的项目不做iOS9以下支持就打开main.storyboard 去除Use safe Area Layout 如果不考虑iOS9以下支持就按照下面的步骤 选中控制器,右边面板的Build ...
- 【转】最近很火的 Safe Area 到底是什么
iOS 7 之后苹果给 UIViewController 引入了 topLayoutGuide 和 bottomLayoutGuide 两个属性来描述不希望被透明的状态栏或者导航栏遮挡的最高位置(st ...
- iOS开发-LayoutGuide(从top/bottom LayoutGuide到Safe Area)
iOS7 topLayoutGuide/bottomLayoutGuide 创建一个叫做LayoutGuideStudy的工程,我们打开看一下Main.storyboard: storyboard-t ...
随机推荐
- BotVS开发基础—2.3 下市价单 交易
代码 def main(): ticker = exchange.GetTicker(); Log("初始账户信息:", exchange.GetAccount()); # 用于对 ...
- 重拾java中的 i++ 和 ++i
java中的 i++ 和 ++i 首先记着要点: 1.i++是先取值再运算. 2.++i是先运算后取值. 举个栗子: int y,x=3;y=(++x)+(++x); 则y=? 分析:先运算后取值,先 ...
- Javaweb向服务器上传文件以及从服务器下载文件的方法
先导入jar包 点击下载 commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流. comm ...
- Spring Boot之Hello World
Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...
- Cognos报表调度与作业管理
本文针对Cognos的报表调度和作业管理做案例分析.为了测试报表定时调度功能,本文将报表定时输出到指定的归档目录. 1. 测试环境 Cognos V11.0 2. 设置档案文件根目录 Cognos报 ...
- Entity Framework Core 2.0 中使用LIKE 操作符
Entity Framework Core 2.0 中使用LIKE 操作符 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译 ...
- Cookie中的HttpOnly详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt377 1.什么是HttpOnly? 如果您在cookie中设置了HttpOn ...
- 【C#多线程编程实战笔记】二、 线程同步
使用Mutex类-互斥锁 owned为true,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态 name为定义的互斥锁名称,在整个操作系统只有一个命名未CSharpThreadingCookb ...
- Java Object中的equals和hashCode
Java的Object对象中有两个方法比较有意思,一个是equals(),一个是hashCode(),那么这两个的作用有些同学可能还不是很清楚,那么同学们现在就进一步了解一下吧. 下面咱们写一个简单的 ...
- 交换机的Ethernet Channel
端口聚合也叫做以太通道(ethernet channel),主要用于交换机之间连接.由于两个交换机之间有多条冗余链路的时候,STP会将其中的几条链路关闭,只保留一条,这样可以避免二层的环 路产生.但是 ...