将automaticallyAdjustsScrollViewInsets和edgesForExtendedLayout和extendedLayoutIncludesOpaqueBars三个放在一起来看,因为三者之间会有一定的相互影响
1.edgesForExtendedLayout
typedef NS_OPTIONS(NSUInteger, UIRectEdge) {
UIRectEdgeNone = 0, // 没有延伸效果
UIRectEdgeTop = 1 << 0, // 上部延伸
UIRectEdgeLeft = 1 << 1, // 左延伸
UIRectEdgeBottom = 1 << 2, // 底部延伸
UIRectEdgeRight = 1 << 3, // 右延伸
UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight // 四个方向都延伸
@property(nonatomic,assign) UIRectEdge edgesForExtendedLayout
UIViewController 的这个属性从名字上来看,就可以得到一些有用的信息:
edgesForExtendedLayout 边缘延伸布局。
也就是说视图布局的时候是否延伸?为什么说延伸或者为什么会延伸呢?
比如:导航控制器,在导航控制器下的控制器情况下,视图的显示区域是屏幕上方就开始计算坐标了,其实就是边缘延伸到了上方,也即是UIRectEdgeTop导致的效果
最直接影响的就是self.view。在延伸的情况下self.view 的高度为 屏幕高度减去 64
例如:
<span style="font-size:14px;">UIView * view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];</span>
这样添加一个view之后,红色的区域从状态栏就开始了,也就是延伸到了导航的下面
打印self.view.frame 为
<span style="font-size:14px;">{{0, 64}, {320, 568}}</span>
现在把edgesForExtendedLayout设置为UIRectEdgeNone ,可以看到已经在导航的下面
打印self.view.frame 为
<span style="font-size:14px;">{{0, 64}, {320, 504}}</span>
同样其它UIRectEdgeLeft,UIRectEdgeRight,UIRectEdgeBottom 这是这样的原理。
其实对于edgesForExtendedLayout 这个属性还是很漂亮的,在导航半透明的情况下,一些模糊的效果还是挺好看的。例如微信的导航就是半透明。
2.automaticallyAdjustsScrollViewInsets //自动调整scrollView的缩进
顾名思义就是是否自动调整scrolloView的缩进
如:iPhone手机的短信软件的短息列表,当我们滑动的时候,信息内容会滑动到导航的下面。
下面看一下这个属性的影响。
如上图scrolloView距离顶部为0,scrolloVIew 的背景色为CyanColor;
下面让其被Push出来,看一下效果
可以看到scrolloView 在屏幕顶端就开始显示,但是他的内容却被自动缩进到了导航栏的下方。这是系统自动为scrolloView缩进了64个单位。
现在设置self.automaticallyAdjustsScrollViewInsets 为NO.
效果如图:
很明显scrolloView 并没有被缩进,全部现在了导航栏的下方。。。
到这里差不多也能看到automaticallyAdjustsScrollViewInsets的真正作用了。
但是还是有几个注意点的
【注意】:
1.当我们设置edgesForExtendedLayout 为UIRectEdgeNone 的时候,automaticallyAdjustsScrollViewInsets 这个无论怎么设置都不会产生影响了。
2.automaticallyAdjustsScrollViewInsets在非导航或TabBar 等特殊控件影响下,也是没有作用的
3.在导航控制器或TabBar控制器下,无论scrolloView 在什么位置都会被自动产生缩进。这点是非常不好的。所以写代码的时候要注意一下。可以将当前控制器的automaticallyAdjustsScrollViewInsets设置为NO,消除影响。
3.extendedLayoutIncludesOpaqueBars
@property(nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars NS_AVAILABLE_IOS(7_0); // Defaults to NO, but bars are translucent by default on 7_0.
顾名思义就是,扩展布局是否包括半透明的Bars(NavigatinBar,TabBar)。默认的为NO;
苹果这样做是很人性化的,如果bars不是半透明的情况下,再使延伸布局到bars的下方,这样感觉是毫无意义的,所以在bars不为半透明的情况下,默认不会延伸布局。
当然我们可以设置self.navigationController.navigationBar.translucent = NO; 取消导航的半透明效果。结果如下:
打印self.view.frame 结果如下:
{{0, 64}, {320, 504}}。
其实就是等同的设置了
self.edgesForExtendedLayout = UIRectEdgeNone;
【注意】
如果还存在TabBar的情况下,并且TabBar为半透明,同样还会延伸到TabBar的下方