导航条影响 scrollView 及其子类的偏移量
在 iOS 开发中,我们有时候会遇到系统默认生成的一些布局 比如:如果 navigationBar下面直接是一个scrollView或者其子类。那么scrollView 及其子类 内部布局会从(0,64)开始,自动向下偏移64个点。 64pt = 状态栏高度20pt + 导航栏高度44pt。
如图所示:一个 tableViewController 被设置为 navigatiViewController 的根视图。
奇怪的是如果我们隐藏了导航条,状态栏仍然会影响 scrollView 的偏移量
把 NavigationBar 给隐藏掉,然后在 controller.view 上 添加一个自定义的 scrollView ,发现scrollView 这次向下偏移了 20pt,这20pt 是状态栏的高度。
如图所示: 隐藏了导航栏,添加了一个scrollView,scrollView 中的内容向下偏移了 20pt。
iOS7.0 之后,在 UIViewController 中有一个属性 automaticallyAdjustsScrollViewInsets
.
1 | @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets NS_AVAILABLE_IOS(7_0); // Defaults to YES |
该属性默认为 YES,需要设置为 NO。
edgesForExtendedLayout 影响顶部布局
在 iOS 7 中,苹果在视图控制器中引入了一个新的属性,edgesForExtendedLayout。
该属性只影响容器视图控制器中的子视图控制器,比如,父控制器为UINavigationViewController的子控制器。 而对于window 的根视图控制器,并没有作用。
1 | @property(nonatomic, assign) UIRectEdge edgesForExtendedLayout |
该属性决定了 controller.view 的布局方式,比如当容器控制器为 UINavigationViewController 时,子控制器view的布局 默认从navigationbar 的顶部开始。这会造成导航栏遮盖住下面的 view。
如图所示:
1 | #ifdef __IPHONE_7_0 |
edgesForExtendedLayout 默认的返回值为 UIRectEdgeAll, 我们可以 设置为 UIRectEdgeNone 或者 UIRectEdgeBottom,解决问题。
如图所示: