解決UIScrollview無端偏移和導航條遮擋view的問題

1.設置自動調整scrollview的 inset

self.automaticallyAdjustsScrollViewInsets = NO;

簡單點說就是automaticallyAdjustsScrollViewInsets根據按所在界面的status bar,navigationbar,與tabbar的高度,自動調整scrollview的 inset,設置爲no,不讓viewController調整。ios

注:本身代碼的問題在於自定義了一個navigationbar,於是系統本身斷定並適配,設置 self.automaticallyAdjustsScrollViewInsets = NO 才達到了效果。app

2.ios7.0之後狀態欄和導航條遮住view

方案一:佈局

//這句話的意思就是讓導航欄不透明且佔空間位置,因此咱們的座標就會從導航欄下面開始算起。
self.navigationController.navigationBar.translucent = NO;

方案二:spa

    
//edgesForExtendedLayoutios7的新屬性,因此在ios7如下設備會出現奔潰現象,解決辦法就是先判斷在使用,能夠經過判斷系統版本,也能夠經過判斷方法是否可以使用
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { self.edgesForExtendedLayout = UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars = NO; self.modalPresentationCapturesStatusBarAppearance = NO; }

注:code

1.edgesForExtendedLayoutblog

 edgesForExtendedLayout默認的值是UIRectEdgeAll就是所有佈局的意思,改爲UIRectEdgeNone就會和ios7以前的系統版本同樣的效果it

2.extendedLayoutIncludesOpaqueBarsio

如 果狀態欄是不透明的,那麼頁面的佈局默認是不會包含狀態欄的,除非將這個屬性設置成爲YES。因此若是你的頁面擴展到Navigation Bar (edgesForExtendedLayout=UIRectEdgeAll),要是這個屬性設置成NO (default), 若是狀態欄是不透明的話,頁面是不會擴展到狀態欄的。
class

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]便可,系統會自動調用這兩個方法。

相關文章
相關標籤/搜索