解决UIScrollview无故偏移和导航条遮挡view的问题

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;

方案二:

    
//edgesForExtendedLayoutios7的新属性,所以在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]即可,系统会自动调用这两个方法。

原文地址:https://www.cnblogs.com/tangaofeng/p/5364324.html