从iOS 7以后ViewController布局起点发生改变,默认情况下从左上角即(0,0)点开始布局,即使屏幕中存在NavigationBar。
影响因素
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.offset(10);
make.right.offset(-10);
make.top.offset(10);
make.bottom.offset(-10);
}];
ViewController的edgesForExtendedLayout属性
此属性默认值为UIRectEdgeAll:从左上角即(0,0)点开始布局;
UIRectEdgeBottom:从导航栏下面,即非刘海屏从(0,64)开始,刘海屏从(0,88)开始;
UIRectEdgeNone:从导航栏下面,即非刘海屏从(0,64)开始,刘海屏从(0,88)开始,到tabbar上方结束;
注意:对于TableView ScrollView等视图来说,在导航栏存在的情况下,将布局设置从(0,0)点开始,TableView会自动预留出导航栏的高度,在iOS11及以上,这是由于SafeArea的原因,简单来说就是SafeArea标记了视图可布局的区域,用来确保我们的视图不会被其他东西(导航栏,刘海等)东西挡住。
在iOS9及以上,这是由于UILayoutGuide的原因,UILayoutGuide用于提供一个矩形区域可以用Auto Layout来定制一些约束特性,作为一个虚拟的view使用。
//关闭这个特性
if (@available(iOS 11.0, *)) {
//禁用自动预留行高
TableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
ViewController.automaticallyAdjustsScrollViewInsets = NO;
NavigationBar的透明度也会影响到布局原点
vc.translucent = YES; 设置导航栏半透明,会将布局限制到左上角开始布局。反之则从导航栏下方开始布局。
vc.extendedLayoutIncludesOpaqueBars = YES;设置导航栏可能透明,也会将布局限制到左上角开始布局。
网友评论