一、简述

iOS11中页面布局引入了页面安全区域safeAreaInsets的概念,因而页面中导航条和Tabbar的款式设置会影响到页面布局。以下三个特点的配置决定了你的页面布局展现款式。

  • translucent 导航条的半透明度设置;
  • edgesForExtendedLayout 视图控制器布局时边际延伸方式;
  • extendedLayoutIncludesOpaqueBars 视图控制器布局时是否包括不透明条;

二、相关特点解释:

  1. 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供给白色布景。
  1. edgesForExtendedLayout: 视图控制器布局时边际延伸方式,默认值为UIRectEdgeAll;不管translucent 的值为true仍是false,都将收效。
  2. extendedLayoutIncludesOpaqueBars: 表明视图控制器布局时是否包括不透明条,默认是NO,只要在 translucent = false时收效。extendedLayoutIncludesOpaqueBars = NO控制器的布局起始位置在导航栏下方,extendedLayoutIncludesOpaqueBars = YES控制器的布局将延伸到导航栏下方,从屏幕顶部开端布局。

三、设置验证

  • 试验1:
 self.navigationController.navigationBar.translucent = YES;
 self.edgesForExtendedLayout = UIRectEdgeAll;
 self.extendedLayoutIncludesOpaqueBars = NO;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
    iOS控制器布局属性如何搭配使用
  • 试验2:
 self.navigationController.navigationBar.translucent = YES;
 self.edgesForExtendedLayout = UIRectEdgeNone;
 self.extendedLayoutIncludesOpaqueBars = NO;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局从导航栏下边际开端核算;
    iOS控制器布局属性如何搭配使用
  • 试验3-1:
 self.navigationController.navigationBar.translucent = YES;
 self.edgesForExtendedLayout = UIRectEdgeAll;
 self.extendedLayoutIncludesOpaqueBars = YES;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
    iOS控制器布局属性如何搭配使用
  • 试验3-2:
 self.navigationController.navigationBar.translucent = YES;
 self.edgesForExtendedLayout = UIRectEdgeNone;
 self.extendedLayoutIncludesOpaqueBars = YES;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局从导航栏下边际开端核算;
    iOS控制器布局属性如何搭配使用
  • 试验3-3:
 self.navigationController.navigationBar.translucent = YES;
 self.edgesForExtendedLayout = UIRectEdgeAll;
 self.extendedLayoutIncludesOpaqueBars = NO;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
    iOS控制器布局属性如何搭配使用
  • 试验3-4:
 self.navigationController.navigationBar.translucent = YES;
 self.edgesForExtendedLayout = UIRectEdgeNone;
 self.extendedLayoutIncludesOpaqueBars = NO;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局从导航栏下边际开端核算;
    iOS控制器布局属性如何搭配使用

经过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;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局从导航栏下边际开端核算;
    iOS控制器布局属性如何搭配使用
  • 试验4-2:
 self.navigationController.navigationBar.translucent = NO;
 self.edgesForExtendedLayout = UIRectEdgeNone;
 self.extendedLayoutIncludesOpaqueBars = NO;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局从导航栏下边际开端核算;
    iOS控制器布局属性如何搭配使用

由4-1和4-2的相同结果可以看出,在translucent = NO状况栏为不透明状况,此刻设置edgesForExtendedLayout将无意义,所以在状况栏不透明时控制器的布局方式默以为 从导航栏下边际开端核算。

  • 试验5-1:
 self.navigationController.navigationBar.translucent = NO;
 self.edgesForExtendedLayout = UIRectEdgeAll;
 self.extendedLayoutIncludesOpaqueBars = YES;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局延伸到导航栏下面,从设备最顶部开端核算;
    iOS控制器布局属性如何搭配使用
  • 试验5-2:
 self.navigationController.navigationBar.translucent = NO;
 self.edgesForExtendedLayout = UIRectEdgeAll;
 self.extendedLayoutIncludesOpaqueBars = NO;

页面状况:

  1. 导航栏款式为半透明;
  2. 控制器viewController的布局从导航栏下边际开端核算;
    iOS控制器布局属性如何搭配使用

1、经过试验5和试验3可以得出结论:特点extendedLayoutIncludesOpaqueBars的设置只要在translucent为NO时(导航栏不透明时)会收效。 2、假如设置edgesForExtendedLayout的值为UIRectEdgeNone 时,extendedLayoutIncludesOpaqueBars 的设置将会被疏忽。控制器布局主要看edgesForExtendedLayout 的设置。

注:UITabBar的状况与UINavigationBar的设置大致上相同。