屏幕适配1(edgesForExtendedLayout、extendedLayoutIncludesOpaqueBars、translucent、automaticallyAdjustsScrollViewInsets)

 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};

原文地址:https://www.cnblogs.com/Zp3sss/p/9108613.html