Safe Area Layout Guide

摘要:
作为安全区域布局指南iOS11中的一项新功能,苹果放弃了顶部和底部布局指南,取而代之的是一个单一的安全区域布局向导:我们的约束现在是安全区域布局指导的顶部和底部锚点。这意味着,即使您仍然以iOS 10和更早版本为目标,也可以切换到使用InterfaceBuilder中的安全区域布局指南。iOS 11 beta种子在UIViewController上也具有safeAreaLayoutGuide属性,但不建议使用。constraintEqualToSystemSpacingBelow方法是iOS 11中的新方法,不需要标准间距的硬编码。对于水平间距,还存在约束EqualToSystemSpacingAfter。

原文:Safe Area Layout Guide

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

Top and Bottom Layouts Guides - 概述

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

Top and Bottom Layout Guides

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

Safe Area Layout Guide

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

Safe Area Layout Guide

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

迁移故事板

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

Xcode 8 constraints

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

Top Layout Guide constraint

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

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

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

Enable Safe Area Layout Guides

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

Safe Area Constraints

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

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

Standard spacing

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

Missing spacing

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

Manual spacing

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

笔记:

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

更多细节

免责声明:文章转载自《Safe Area Layout Guide》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ionic2中的Navigation.mdPython 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章