iOS11 新特性,如何适配iOS11(二)
管理margins 和 islets
layout margins
基于约束的Autolayout,使我们方便的布局视图。Auto layout为每一个View 都定义了margin。margin是指控件显示内容的边缘与控件边缘的距离。
可以用layoutMargins或者layoutMarginsGuide属性获得view的margin,margin是视图内部的一部分。layoutMargins允许获取或者设置UIEdgeInsets结构的margin。layoutMarginsGuide则获取到只读的UILayoutGuide对象。
在iOS11新增了一个属性:directional layout margins,该属性是NSDirectionalEdgeInsets结构题类型的属性:
typedef struct NSDirectionalEdgeInsets{
CGFloat top,leading,bottom,trailing;
}NSDirectionalEdgeInsetsAPI_AVAILABLE(ios(11.0),tvos(11.0),watchos(4.0));
layoutMargins是UIEdgeInsets结构体类型的属性:
typedef struct UIEdgeInsets{
CGFloat top, left, bottom, right;
}UIEdgeInsets;
从定义来看,NSDirectionalEdgeInsets用leading 和 trailing 代替了left和right。
安全区域(Safe Area)
在iOS11 中topLayoutGuide和bottomLayoutguide被废除了,取而代之的就是safeArea的概念,safeArea好似描述你的视图不被任何内容遮挡的方法。它提供两种方式:safeAreaInsets或safeAreaLayoutGuide来提供给你safeArea的参照值,即 insets 或者 layout guide。 safeArea区域如图所示:
如果有一个自定义的viewController,你可能要添加你自己的bars,增加safeAreaInsets的值,可以通过一个新的属性:addtionalSafeAreaInsets来改变safeAreaInsets的值,当你的viewController改变了它的safeAreaInsets值时,有两种方式获取到回调:
UIView.safeAreaInsetsDidChange()UIViewController.viewSafeAreaInsetsDidChange()