【iOS】View Controllers布局相关参数:edgesForExtendedLayout和automaticallyAdjustsScrollViewInsets

记录

参考:https://www.jianshu.com/p/ca3c5a94c32b

edgesForExtendedLayout

typedef enum : NSUInteger {
   UIRectEdgeNone   = 0,
   UIRectEdgeTop    = 1 << 0,
   UIRectEdgeLeft   = 1 << 1,
   UIRectEdgeBottom = 1 << 2,
   UIRectEdgeRight  = 1 << 3,
   UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight 
} UIRectEdge;

设置此属性,可以指定UIViewController.view的范围(上下左右四个方向)延伸到整个屏幕

默认为UIRectEdgeAll,即UIViewController.view占据整个屏幕

一般会用到UIRectEdgeNone,即UIViewController.view不会延伸,因此如果此时屏幕中有导航栏,view也会相应往下缩

这个属性只有当view controller被添加到别的container view controller(最普遍的场景是添加到UINavgationController)中才会起作用

automaticallyAdjustsScrollViewInsets

如果edgesForExtendedLayout设置了UIRectEdgeAll,那么UIViewController.view占据整个屏幕,此时给view添加一个UIScrollerView(或其子类,比如UITableView)时,scrollView就可能被导航栏遮挡,这时就用到了UIViewController.automaticallyAdjustsScrollViewInsets,当设置为YES时,UIViewController会给scrollView顶部添加一个contentInset(注意不是把scrollView往下推),这样在显示上scrollView就不会被导航栏遮挡,同时scrollView的颜色也能反映在导航栏上。根据文档描述,此值除了导航栏,也会考虑到状态栏、工具栏等(猜测这些东西应该是要添加到UINavgationController,然后UIViewController添加到UINavgationController中才能计算的到)

此值默认为YES。

extendedLayoutIncludesOpaqueBars

这个属性决定了UIViewController.view能不能延伸到不透明的状态栏上。在UIViewController.edgesForExtendedLayout = UIRectEdgeAll的情况下,如果UIViewController.extendedLayoutIncludesOpaqueBars == NO,view就不会延伸到不透明的状态栏上

此值默认为NO。


解决的问题

在不知道这个属性的时候,默认的BaseViewController.edgesForExtendedLayout是UIRectEdgeAll,导致所有具有导航栏的子页面的内容都需要手动从导航栏下开始布局(即view.frame.oringin.y要增加一个navHeight高度)。现在通过设置edgesForExtendedLayout,同时给BaseViewController提供控制导航栏显示/隐藏的开关,子页面就可以默认从CGPoint(0,0)开始布局。

你可能感兴趣的:(iOS学习)