• 屏幕适配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};

  • 相关阅读:
    进程,线程,协程,异步IO知识点
    Socket网络编程知识点
    面向对象编程知识点
    Zabbix系列之七——添加磁盘IO监测
    WARNING: 'aclocal-1.14' is missing on your system.
    tomcat的catalina.out日志按自定义时间日式进行分割
    Plugin with id 'com.novoda.bintray-release' not found.的解决方案
    MaterialCalendarDialog【Material样式的日历对话框】
    导入项目报错【Minimum supported Gradle version is 3.3. Current version is 2.14.1】
    通过Calendar简单解析Date日期,获取年、月、日、星期的数值
  • 原文地址:https://www.cnblogs.com/Zp3sss/p/9108613.html
Copyright © 2020-2023  润新知