ios 中 UINavigationController关于translucent,extendedLayoutIncludesOpaqueBars,automaticallyAdjustsScrollViewInsets 的理解
之前滑动tableVIew导航栏渐变效果的。今天手机升级到了 ios11 ,并用 xcode9打了一个包,结果就出现了视图的顶端出现了空白的的情况。
这是一个布局的问题,关于布局我们来了解一下导航的一个重要属性translucent
translucent :是半透明效果
ios7出现的新属性,默认yes,
self.navigationController.navigationBar.translucent=YES;
在translucent设置为 NO 的时候 ,那么视图就会整体往下偏移
图中空出的部分,即为导航条UINavigationBar。此时计算frame应从导航栏下部为0开始计算。如果从屏幕的左上角开始算的话,整体往下偏移64像素。translucent一般不会单独使用,通常情况下我们会结合extendedLayoutIncludesOpaqueBarsextendedLayoutIncludesOpaqueBars:不透明情况下是否可以拓展。
默认为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];