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