UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollVi...

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

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


UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollVi..._第1张图片

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

translucent :是半透明效果

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

self.navigationController.navigationBar.translucent=YES;

UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollVi..._第2张图片

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

UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollVi..._第3张图片
图中空出的部分,即为导航条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,那么视图仍会延伸覆盖到四周的区域。

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

UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollVi..._第4张图片

因此,我们为了不让我们的控件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));

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


UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollVi..._第5张图片

我们要设置以下的属性

//半透明的

self.navigationController.navigationBar.translucent=NO;

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

self.extendedLayoutIncludesOpaqueBars=YES;

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

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

self.edgesForExtendedLayout=UIRectEdgeAll;

[self setNeedsStatusBarAppearanceUpdate];

你可能感兴趣的:(UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollVi...)