美文网首页
edgesForExtendedLayout | extende

edgesForExtendedLayout | extende

作者: 面皮大师 | 来源:发表于2018-02-24 16:55 被阅读26次

    一个ViewController的默认布局

    我们在大部分的程序布局上是一个TableViewController在上下分别是:
    TabBarController和NavigationController.


    屏幕快照 2018-02-24 下午2.18.13.png

    在我们添加任何代码的情况下运行后的布局如下:


    Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 14.29.41.png
    在iOS7之后,苹果鼓励使用这种默认的全屏模式,默认的NavigationBar和TabBar是半透明,上下滑动Table的视图会上下延伸.也就是表示TableView的Frame和显示区域都是屏幕的大小.

    edgesForExtendedLayout

    UIViewController包含一个edgesForExtendedLayout属性,字面意思是拓展的边距布局.

    屏幕快照 2018-02-24 下午2.34.29.png
    当我们设置:
    self.edgesForExtendedLayout = UIRectEdgeNone;
    
    Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 14.31.13.png

    上面代码达到的效果和设置TabBar和navigationBar的透明度达到的效果是一致的.即ViewController的主View的上下和大小发生了变换.变成了从NavigationBar的底部开始到TabBar的顶部结束.

    self.navigationController.navigationBar.translucent = NO;
    self.tabBarController.tabBar.translucent = NO;
    

    这里要强调一下:edgesForExtendedLayout无论是TableViewController还是普通的ViewController影响是一致的.当设置edgesForExtendedLayout与否会直接影响主View的位置,如下:


    默认不做任何设置
    设置self.edgesForExtendedLayout = UIRectEdgeNone;

    extendedLayoutIncludesOpaqueBars

    这个属性字面意思:延伸的布局是否包括bar,这个属性只有在Bar不透明的时候有作用.默认值是NO,即不延伸.

    self.navigationController.navigationBar.translucent = NO;
    self.extendedLayoutIncludesOpaqueBars = NO;//默认情况
    
    Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 16.07.34.png
    self.navigationController.navigationBar.translucent = NO;
    self.extendedLayoutIncludesOpaqueBars = YES;
    

    这个时候self.view.bounds为全屏.


    Simulator Screen Shot - iPhone 8 Plus - 2018-02-24 at 16.09.21.png

    综上:优先级是先看edgesForExtendedLayout,再看navigationBar是否透明,在不透明的情况下才看extendedLayoutIncludesOpaqueBars。以上这几个属性是对被添加的子视图布局产生影响,达到的效果基本相同,但还是有细微的区别。

    automaticallyAdjustsScrollViewInsets

    这个属性的字面意思是:自动适配滚动视图的内容,ios11之后已经弃用了.用的最新的Xcode已经无法在模拟器上重现了.
    简单介绍一下,当我们设置:

    self.edgesForExtendedLayout = UIRectEdgeAll;//默认值
    self.automaticallyAdjustsScrollViewInsets = YES;//默认值
    

    TableView的显示内容会从navigationBar的底部开始显示,向上滑动的时候还是会穿过透明的导航栏全屏扩展.

    self.edgesForExtendedLayout = UIRectEdgeAll;//默认值
    self.automaticallyAdjustsScrollViewInsets = NO;
    

    这个时候TableView的显示内容会从全屏的左上角开始,也就是默认进入页面的时候, TableView的上面的Cell是被半透明的NavigationBar遮挡住的.

    介绍了这么多都没什么用啦,因为ios11来啦.

    automaticallyAdjustsScrollViewInsets在ios11上被弃用.


    automaticallyAdjustsScrollViewInsets

    edgesForExtendedLayout虽然没被弃用,但是在介绍里面有了替代的属性,safeArea相关的.

    edgesForExtendedLayout

    contentInsetAdjustmentBehavior

    ios11里面使用这个属性替代了automaticallyAdjustsScrollViewInsets.
    这个属性的枚举值如下:

     typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
            UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable
            UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
            UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
            UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
        } API_AVAILABLE(ios(11.0),tvos(11.0));
    
    1. automatic 和scrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
    2. scrollableAxes 自动计算内边距.
    3. never 不计算内边距
    4. always 根据safeAreaInsets 计算内边距

    相关文章

      网友评论

          本文标题:edgesForExtendedLayout | extende

          本文链接:https://www.haomeiwen.com/subject/utbqxftx.html