1.设置自动调整scrollview的 inset
self.automaticallyAdjustsScrollViewInsets = NO;
简单点说就是automaticallyAdjustsScrollViewInsets根据按所在界面的status bar,navigationbar,与tabbar的高度,自动调整scrollview的 inset,设置为no,不让viewController调整。
注:自己代码的问题在于自定义了一个navigationbar,因而系统自己判定并适配,设置 self.automaticallyAdjustsScrollViewInsets = NO 才达到了效果。
2.ios7.0以后状态栏和导航条遮住view
方案一:
//这句话的意思就是让导航栏不透明且占空间位置,所以我们的坐标就会从导航栏下面开始算起。
self.navigationController.navigationBar.translucent = NO;
方案二:
//edgesForExtendedLayout是ios7的新属性,所以在ios7以下设备会出现奔溃现象,解决办法就是先判断在使用,可以通过判断系统版本,也可以通过判断方法是否可使用
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.edgesForExtendedLayout = UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars = NO; self.modalPresentationCapturesStatusBarAppearance = NO; }
注:
1.edgesForExtendedLayout
edgesForExtendedLayout默认的值是UIRectEdgeAll就是全部布局的意思,改成UIRectEdgeNone就会和ios7之前的系统版本一样的效果
2.extendedLayoutIncludesOpaqueBars
如 果状态栏是不透明的,那么页面的布局默认是不会包含状态栏的,除非将这个属性设置成为YES。所以如果你的页面扩展到Navigation Bar (edgesForExtendedLayout=UIRectEdgeAll),要是这个属性设置成NO (default), 如果状态栏是不透明的话,页面是不会扩展到状态栏的。
3.modalPresentationCapturesStatusBarAppearance
iOS7以前不能针对每一个UIViewController单独控制状态栏的显示隐藏,只能在需要的时候调用setStatusBarHidden/setStatusBarStyle修改状态栏显示或者样式,iOS7以后,状态栏是透明的。plist参数多了一个View controller-based status bar appearance。
如果View controller-based status bar appearance 为NO,则表示状态栏不受UIViewController的单独控制,那么这个时候状态栏的控制还和iOS7以前的方式一样,在需要修改的地方执行setStatusBarHidden。
而如果设置为YES,则状态栏会根据各个UIViewController的配置改变,UIViewController中如果需要改变状态栏则需要重载以下两个方法:
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent;//状态栏样式 } - (BOOL)prefersStatusBarHidden { return NO;//状态栏是否隐藏 }
UIViewController初始化的时候会自动执行这个两个方法,之后如果需要刷新状态栏样式的时候,调用[self setNeedsStatusBarAppearanceUpdate]即可,系统会自动调用这两个方法。