美文网首页
UINavigationController关于transluc

UINavigationController关于transluc

作者: 浅忆的简书 | 来源:发表于2017-09-21 16:54 被阅读0次

    ios 中 UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollViewInsets 的理解

    之前滑动tableVIew导航栏渐变效果的。今天手机升级到了 ios11 ,并用 xcode9打了一个包,结果就出现了视图的顶端出现了空白的的情况。

    这是一个布局的问题,关于布局我们来了解一下导航的一个重要属性translucent

    translucent :是半透明效果

    ios7出现的新属性,默认yes,

    self.navigationController.navigationBar.translucent=YES;

    在translucent设置为 NO 的时候 ,那么视图就会整体往下偏移

    图中空出的部分,即为导航条UINavigationBar。此时计算frame应从导航栏下部为0开始计算。如果从屏幕的左上角开始算的话,整体往下偏移64像素。translucent一般不会单独使用,通常情况下我们会结合extendedLayoutIncludesOpaqueBars

    extendedLayoutIncludesOpaqueBars:不透明情况下是否可以拓展。

    默认为NO,也就是不可以扩展。当translucent设置为NO,即导航栏UINavigationBar不透明的时候,默认不能扩展。若我们设置为YES,则会出现导航遮挡视图的情况。

    在导航控制器中还有一个跟布局有关的属性edgesForExtendedLayout

    edgesForExtendedLayout:扩展布局的边缘

    在iOS7以后 UIViewController 开始使用全屏布局,而且是默认的属性。通常涉及到布局,就离不开这个属性 edgesForExtendedLayout,它是一个枚举类型

    typede fNS_OPTIONS(NSUInteger, UIRectEdge) {

    UIRectEdgeNone=0,

    UIRectEdgeTop=1<<0,

    UIRectEdgeLeft=1<<1,

    UIRectEdgeBottom =1<<2,

    UIRectEdgeRight=1<<3,

    UIRectEdgeAll=UIRectEdgeTop|UIRectEdgeLeft|UIRectEdgeBottom|UIRectEdgeRight

    }NS_ENUM_AVAILABLE_IOS(7_0);

    由于iOS7鼓励全屏布局,所以它的默认值是UIRectEdgeAll,四周边缘均延伸,就是说,如果即使视图中上有UINavigationBar,下有UITabBar,那么视图仍会延伸覆盖到四周的区域。

    在默认情况下,导航栏会覆盖我们视图

    因此,我们为了不让我们的控件UIView延伸到UINavigationBar下面,我们可以将该属性设置为UIRectEdgeNone。代码如下:

    [self setEdgesForExtendedLayout:UIRectEdgeNone];

    下面我介绍关于导航控制器最后一个属性影响布局的最后一个属性

    automaticallyAdjustsScrollViewInsets:自动校准滚动视图的嵌入视图

    这个属性只针对 ScrollView 或者其自视图,automaticallyAdjustsScrollViewInsets是一个bool类型,默认为YES,也就是会自动校准滚动视图的嵌入视图。这个属性是在 ios11之前是起作用的的,在 ios11只有使用 ScrollView 下的一个属性contentInsetAdjustmentBehavior。同样也是一个枚举

    typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {

    UIScrollViewContentInsetAdjustmentAutomatic,

    UIScrollViewContentInsetAdjustmentScrollableAxes,

    UIScrollViewContentInsetAdjustmentNever,

    UIScrollViewContentInsetAdjustmentAlways,

    }API_AVAILABLE(ios(11.0),tvos(11.0));

    如果想让视图出现下面这种效果

    我们要设置以下的属性

    //半透明的

    self.navigationController.navigationBar.translucent=NO;

    // 不透明的条下是否可以扩展

    self.extendedLayoutIncludesOpaqueBars=YES;

    _tableView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever;(scrollView的属性)

    //self.automaticallyAdjustsScrollViewInsets=NO;// 在 ios11以前此属性

    self.edgesForExtendedLayout=UIRectEdgeAll;

    [self setNeedsStatusBarAppearanceUpdate];

    相关文章

      网友评论

          本文标题:UINavigationController关于transluc

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