0、属性所属
UIViewController中的属性:
edgesForExtendedLayout :根view延伸方向
extendedLayoutIncludesOpaqueBars:根view在bar不透明情况下,是否允许延伸(YES:允许延伸)
automaticallyAdjustsScrollViewInsets:scrollView和其子类是否有系统自动调整子控件位置(即如果scrollView被bar遮挡时,子控件自动下移一定距离,保证内容不会被覆盖)
UINavigationBar中属性:
translucent:bar是否透明(YES:bar透明)
1、edgesForExtendedLayout
在navigationBar透明的情况下:
从iOS7开始,苹果开始提倡全屏布局,即默认情况下控制器的根View的大小等于屏幕的大小,即使存在navigationBar+tabBar,View的大小不变等于屏幕的大小,这样导致的结果就是navigationBar和tabBar会将View的顶部和底部的区域覆盖掉。如下图结果
当前根view顶部区域被导航栏覆盖掉了。
为了避免上出现被覆盖的情况,需要修改edgesForExtendedLayout属性。
edgesForExtendedLayout是一个枚举类型。 typedef enum : NSUInteger { UIRectEdgeNone = 0, UIRectEdgeTop = 1 << 0, UIRectEdgeLeft = 1 << 1, UIRectEdgeBottom = 1 << 2, UIRectEdgeRight = 1 << 3, UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight } UIRectEdge; self.view.edgesForExtendedLayout = UIRectEdgeTop; //表示view向上延伸到屏幕上边框。 self.view.edgesForExtendedLayout = UIRectEdgeAll; //表示view向四周延伸到屏幕的各个边框。 self.view.edgesForExtendedLayout = UIRectEdgeNone; //表示view不向四周延伸,保证不会被navigationbar和tabbar覆盖掉。
在NavigationBar不透明的情况下
当navigationBar处于不透明的状态下,控制器的根View不会向四周延伸(保持不被任何控件覆盖)
2、extendedLayoutIncludesOpaqueBars
该属性的意思为在bar不透明的情况下根View是否进行延伸,该属性只能使用在bar不透明的情况下,在navgationBar透明的情况下,设置无效。
图1 图2
图1中 - (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; // view向四周延伸 self.navigationController.navigationBar.translucent = NO; // bar不透明 self.extendedLayoutIncludesOpaqueBars = YES; // 在不透明情况下允许view向四周延伸 } 图2中 - (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeNone; // view向四周延伸 self.navigationController.navigationBar.translucent = NO; // bar不透明 self.extendedLayoutIncludesOpaqueBars = NO; // 在不透明情况下允许view向四周延伸 } 注意:在bar不透明的情况下edgesForExtendedLayout与extendedLayoutIncludesOpaqueBars需要配合使用在可以达到想要的效果。
// UIRectEdgeNone + YES view不会向四周延伸
- (void)viewDidLoad { [super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeNone; // view向四周延伸 self.navigationController.navigationBar.translucent = NO; // bar不透明 self.extendedLayoutIncludesOpaqueBars = YES; // 在不透明情况下允许view向四周延伸 }
// UIRectEdgeAll + NO , view不会向四周延伸
- (void)viewDidLoad {
[super viewDidLoad]; self.edgesForExtendedLayout = UIRectEdgeAll; // view向四周延伸 self.navigationController.navigationBar.translucent = NO; // bar不透明 self.extendedLayoutIncludesOpaqueBars = NO; // 在不透明情况下允许view向四周延伸 }
3、automaticallyAdjustsScrollViewInsets
该字段的意思为是否自动调整scrollView中子控件位置(自动tableView中cell的显示位置,如果tableView被bar覆盖,则所有cell会下移64点)。
选中的蓝色透明的view为tableView,红色为tableHeadView
tableView已经顶到屏幕上边框,被navigationbar覆盖了,猜想应该时tableHeadView.top ==tableView.top,但是现在真机效果下tableHeadView.top == (tableView.top+64),由于automaticallyAdjustsScrollViewInsets默认为YES,系统对tableView中的子控件下调64个点,保证tableView中的子控件不会被navigationBar覆盖。
注意:scrollView与其子类必须放在控制器的根View上并且automaticallyAdjustsScrollViewInsets设置为YES时,系统才会为我们自动调整。
黄色view:根View
蓝色View:根View的子View
透明选中的蓝色View :子View下的tableView
1、由于tableView添加到蓝色View,但没有添加到根View上,即使automaticallyAdjustsScrollViewInsets=YES,系统也不会被帮我们调整,从上图可以看出tableHeaderView
被navigationBar覆盖掉了。
2、在iOS11中automaticallyAdjustsScrollViewInsets已经失效了,被替换成需scrollView中的contentInsetAdjustmentBehavior参数
4、translucent
该属性为navigationBar中的属性,设置navigationBar是否透明,当navigationBar.translucent = NO时,两种方式给NavigationBar设置颜色
1) self.navigationController.navigationBar.tintColor = [UIColor redColor]; 2) [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"1.png"] forBarMetrics:(UIBarMetricsDefault)];
5、scrollView.contentinset参数
contentInset参数与automaticallyAdjustsScrollViewInsets不影响,即使scrollView中的子控件因为系统自动下调了,但是contentInset还是为{0,0,0,0};