以下文章统一单位为pt。
1.导航栏 - 状态栏。
一般人都会默认为导航栏为64。而实际上这个导航栏是指状态栏+导航栏默认为64,苹果X及以上机型则是88。 导航栏目前是统一默认为是44。状态栏默认为24,如果是苹果及苹果X以上的机型则是默认为20。 可以运用三目运算,写成宏定义。
2.标签栏。
标签栏一般默认为是49,而实际上这个标签栏也是49,不过在苹果X及以上机型上面会变成49 +34 。
3.表视图
在iOS11系统的时候表视图有时候会突然向上或者向下偏移了64或者20 。
原因:iOS11系统中控制器是没有automaticallyAdjustsScrollViewInsets这个属性的。当表视图超过了安全区域,系统自动是会自动调整表视图的 safeAreaInsets这个属性的。从而导致表视图adjustedContentInset属性。那么问题就来了,在iOS11系统中决定内容与边缘边距的是表视图的adjustedContentInset属性。与表视图的contentInset这个属性是无关的。表视图是继承滑动视图的。滑动视图在iOS11中是多了adjustContentInset以及contentInsetAdjustmentBehavior这2个属性。
adjustContentInset:系统计算的代表代表滑动视图的contenView.frame.origin。偏移了滑动视图的内容的距离。怎么计算是由滑动视图的contentInsetAdjustmentBehavior这个属性决定的。主要为下面的几种方式。
01. UIScrollViewContentInsetAdjustmentAutomatic:如果在一个automaticallyAdjustsScrollViewInsets = YES 的控制器上,并且这个控制器有导航控制器,这种情况下会设置在top && bottom上 adjustedContentInset = safeAreaInset + contentInset不管是否滚动。其他时候与UIScrollViewContentInsetAdjustmentScrollableAxes一样。
02. UIScrollViewContentInsetAdjustmentScrollableAxes: 在可滚动方向上adjustedContentInset = safeAreaInset + contentInset,在不可滚动方向上adjustedContentInset = contentInset;基于scrollEnabled和alwaysBounceHorizontal / vertical = YES.
03. UIScrollViewContentInsetAdjustmentNever: adjustedContentInset = contentInset
04. UIScrollViewContentInsetAdjustmentAlways: adjustedContentInset = safeAreaInset + contentInset
当contentInsetAdjustmentBehavior设置为UIScrollViewContentInsetAdjustmentNever的时候,adjustContentInset值将不受SafeAreaInset值的影响。
我这边就目前暂时带过,详情细度请参考百度iOS 11 表视图适配。
4.图片变形的适配方法
有些人针对图片变形这一块喜欢专门封装方法去做裁剪然后再去加载裁剪好的图片这样的话就不会变形。
其实我想说的是根本就不需要裁剪不管本地图片也好,网络图片也罢。系统这里是有方法的。大家注意到了没有view是有一个系统属性的。叫做contentMode。但是目前这个属性只针对UIImageView有效果。
这个contentMode提供给到了我们几种样式。
UIViewContentModeScaleToFill : 默认是会对图片进行各方面拉伸处理直到铺满整个图片。(其实说白了就是变形)这个目前也是系统当你不设置的时候默认的就是这个。
UIViewContentModeScaleAspectFit:是按原图比例去缩小或者放大的,但是这样的话会有一个问题。就是图片会超过原来的图的大小,这个时候我们采用clipsToBounds这个属性就好了,系统就会帮你自动把超过的地方给裁剪掉。
UIViewContentModeCenter:保持原图比例中心显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeTop:保持原图比例按英文显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeBottom:保持原图比例按英文显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeLeft:保持原图比例中心显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeRight:保持原图比例中心显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeTopLeft:保持原图比例按英文显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeTopRight:保持原图比例按英文显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeBottomLeft:保持原图比例按英文显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
UIViewContentModeBottomRight:保持原图比例中心显示视图 和原来的大小一样。需要和clipsToBounds这个属性配合使用。
特别注意:如果是按钮只是需要按钮的imageView去调用这个属性,而不是按钮本身去调用这个属性。谨记。
关于安全区域:
何为安全区域,安全区域就是可以在手机上面交互的地方。但是为了适配苹果X很多人会关掉安全区域。下面我这边讲的就是如何关掉安全区域。
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
contentInsetAdjustmentBehavior这个属性目前是滑动视图才有的属性,比如webView就需要先获取到滑动视图的属性,然后再进行这种。