UIViewController的界面布局属性:
1、导航栏透明translucent属性默认为YES,意味着子控件以(0,0)点为坐标系布局;
1.1、self.edgesForExtendedLayout = UIRectEdgeAll;
1.1.1、无safearea:
1.1.1.1、automaticallyAdjustsScrollViewInsets YES: iOS10及以下机型,根视图全屏,scrollView从0开始,根据设定的约束高度开始布局。contentInset固定64,展示出64px的inset区域。 iOS11及以上机型,根视图全屏,scrollView从0开始,根据设定的约束高度开始布局,contentInset为导航栏高-scrollView的布局高。如果scrollView的布局高<导航栏高,最终scrollView的inset区域都在导航条下,inset看不到,scrollView在导航栏下发开始展示。如果scrollView的布局高>导航栏度,则inset值为0,inset依然看不到,scrollView在布局高-导航栏高位置开始显示。 总结:子视图内容偏移到导航条下面。
1.1.1.2、automaticallyAdjustsScrollViewInsets NO: 此种情况,根视图全屏,scrollView从0开始,根据设定的约束高度开始布局,无contentInset值。 总结:子视图在顶部,内容不偏移。
1.1.2、safearea情况下:
1.1.2.1、automaticallyAdjustsScrollViewInsets YES: iOS10及以下机型,根视图全屏,scrollView从0开始,根据设定的约束高度开始布局。contentInset固定64,最终展示出64px的inset区域。 总结:子视图内容偏移到导航条下面。 iOS11及以上机型,根视图全屏,scrollView从导航栏底部开始,按约束高度开始布局,即64或88开始+约束值。约束值为正,则inset值为0,视图按约束值大小向下的位置开始布局;约束值为负,scrollView的inset为约束值绝对值,约束值<导航条高度,scrollview在导航条下开始布局,约束值>导航条高度,超过部分的视图开始被导航条压到。 总结:子视图从导航条下方开始展示。
1.1.2.2、automaticallyAdjustsScrollViewInsets NO: iOS10及以下,根视图全屏,scrollView从设定的布局高度开始布局。contentInset固定0。 总结:子视图在顶部,内容不偏移。 iOS11情况与automaticallyAdjustsScrollViewInsets YES情况一致。 总结:子视图从导航条下方开始展示。
1.2、self.edgesForExtendedLayout = UIRectEdgeNone;根视图为(0,64)开始布局,与导航条不透名的情况一样。
2、导航栏不透明,根视图以(0,64)或(0,88)开始布局,根视图高度为屏幕高度-导航条高度。根视图完全在可视区域,子视图从根视图边缘指定的约束位置开始布局。
2.1、self.edgesForExtendedLayout = UIRectEdgeAll不起作用。
2.1.1、safearea、automaticallyAdjustsScrollViewInsets也均不起作用,scrollView不被遮挡,view不被遮挡。
safearea
iOS9或10上导致布局问题,应该是低版本系统对safearea兼容性不好,需要设置self.edgesForExtendedLayout = UIRectEdgeNone;
extendedLayoutIncludesOpaqueBars
属性意思是,延伸视图包不包含不透明的Bar,不透明默认值为NO,透明时默认为YES。
可以手动设置为YES,无论什么情况都延伸布局;
可以手动设置为NO,无论什么情况都不延伸布局。
automaticallyAdjustsScrollViewInsets
属性意思是自动计算滚动视图的内容边距,设为YES自动处理insets值,设为NO不处理insets值。
但是automaticallyAdjustsScrollViewInsets这个属性在iOS11上过期了。
我们需要使用UIScrollView的contentInsetAdjustmentBehavior属性来替代它(从viewcontroller的属性变为了view的属性)。
View的界面布局属性:
edgesForExtendedLayout:
指定视图边缘延伸的方向,默认为UIRectEdgeAll。
contentInsetAdjustmentBehavior:
iOS11替代Controller的automaticallyAdjustsScrollViewInsets这个属性,枚举值包括以下4种:
1、automatic 和scrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
2、scrollableAxes自动计算内边距.
3、never不计算内边距
4、always根据safeAreaInsets计算内边距
网友评论