一、简述
iOS11中页面布局引入了页面安全区域safeAreaInsets
的概念,因而页面中导航条和Tabbar的款式设置会影响到页面布局。以下三个特点的配置决定了你的页面布局展现款式。
- translucent 导航条的半透明度设置;
- edgesForExtendedLayout 视图控制器布局时边际延伸方式;
- extendedLayoutIncludesOpaqueBars 视图控制器布局时是否包括不透明条;
二、相关特点解释:
-
translucent: iOS7之前默认值为NO,iOS7之后
translucent
会根据导航条的布景和barStyle推测,然后确定实在的值。假如barStyle设置为UIBarStyleBlackTranslucent,则始终为YES。
- 假如导航栏没有界说布景图或布景图的alpha的值小于1.0,则
translucent
默以为YES; - 假如导航栏布景图是彻底不透明时,则
translucent
默以为NO; - 假如
translucent
设置为YES(半透明)时,那么导航栏的自界说布景图彻底不透明,UIKit会将系统界说的不透明度应用于布景图; - 假如
translucent
设置为NO时,并且布景图画不不透明,UIKit将添加不透明布景; UIKit将运用导航栏的Nar的barTintColor为图画供给不透明布景,假如barTintColor为nil,则为UIBarStyleBlack供给黑色布景或者为UIBarStyleDefault供给白色布景。
-
edgesForExtendedLayout: 视图控制器布局时边际延伸方式,默认值为UIRectEdgeAll;不管
translucent
的值为true仍是false,都将收效。 -
extendedLayoutIncludesOpaqueBars: 表明视图控制器布局时是否包括不透明条,默认是NO,只要在
translucent = false
时收效。extendedLayoutIncludesOpaqueBars = NO
控制器的布局起始位置在导航栏下方,extendedLayoutIncludesOpaqueBars = YES
控制器的布局将延伸到导航栏下方,从屏幕顶部开端布局。
三、设置验证
- 试验1:
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = NO;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
- 试验2:
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局从导航栏下边际开端核算;
- 试验3-1:
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = YES;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
- 试验3-2:
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局从导航栏下边际开端核算;
- 试验3-3:
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = NO;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
- 试验3-4:
self.navigationController.navigationBar.translucent = YES;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局从导航栏下边际开端核算;
经过3-1和3-3来看与”状况1″的结果是相同的,3-2和3-4的结果与”状况2″相同,说明在
translucent = YES
的状况下extendedLayoutIncludesOpaqueBars
特点值的设置无效,控制器延伸布局终究看的是edgesForExtendedLayout
。
- 试验4-1:
self.navigationController.navigationBar.translucent = NO;
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = NO;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局从导航栏下边际开端核算;
- 试验4-2:
self.navigationController.navigationBar.translucent = NO;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局从导航栏下边际开端核算;
由4-1和4-2的相同结果可以看出,在
translucent = NO
状况栏为不透明状况,此刻设置edgesForExtendedLayout
将无意义,所以在状况栏不透明时控制器的布局方式默以为 从导航栏下边际开端核算。
- 试验5-1:
self.navigationController.navigationBar.translucent = NO;
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = YES;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
- 试验5-2:
self.navigationController.navigationBar.translucent = NO;
self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = NO;
页面状况:
- 导航栏款式为半透明;
- 控制器viewController的布局从导航栏下边际开端核算;
1、经过试验5和试验3可以得出结论:特点
extendedLayoutIncludesOpaqueBars
的设置只要在translucent
为NO时(导航栏不透明时)会收效。 2、假如设置edgesForExtendedLayout
的值为UIRectEdgeNone
时,extendedLayoutIncludesOpaqueBars
的设置将会被疏忽。控制器布局主要看edgesForExtendedLayout
的设置。
注:UITabBar的状况与UINavigationBar的设置大致上相同。