http://www.cocoachina.com/bbs/read.php?tid=280826php
http://www.jianshu.com/p/bcd21a0d826capp
self.view.fream.net
http://blog.csdn.net/zuoerjin/article/details/24373453code
// 設置CGRectZero從導航欄下開始計算 blog
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {繼承
self.edgesForExtendedLayout = UIRectEdgeNone;get
}io
第二種方法:class
// self.navigationController.navigationBar.translucent = YES;或者NO;擴展
第三種方法:
// self.automaticallyAdjustsScrollViewInsets = NO;
三種方法效果差很少,可是也有部分差別,筆者推薦第一種。
//nav的第一個子視圖是scrollview的時候 系統才自動給scrollview加上64的inset 這偏移與第三方的下拉刷新衝突
self.automaticallyAdjustsScrollViewInsets = NO;
//解決衝突 禁止系統偏移(通常不用這個)
self.navigationController.navigationBar.translucent = YES;
// 設置CGRectZero從導航欄下開始計算
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
若是你準備將你的老的 iOS 6 app 遷移到 iOS 7 上,那麼你必須注意了。當你的老的 app 在 iOS 7 設備上運行時,全部ViewController 的視圖都總體上移了,由於 iOS 7 把整個屏幕高度(包括狀態欄和導航欄)都做爲了視圖控制器的有效高度。因而你的視圖上移了,並和上層的狀態欄交疊在一塊兒。
你固然能夠在 Xcode 中修改每一個 View,將他們下移20個像素(狀態欄高度)或者64個像素(狀態欄+導航欄高度)。
可是蘋果顯然已經考慮到這個問題,他們在 iOS 7 SDK 中爲 ViewController 提供了一個 edgesForExtendedLayout 新屬性。若是你將這個屬性設置爲UIRectEdgeNone,則 viewController 的全部子視圖都會自動調整,這樣在 iOS 7 下看到的效果和 iOS 6 徹底同樣。
爲了方便,你能夠爲 UIViewController 擴展一個子類,並覆蓋它的 viewDidLoad 方法:
@implementation DerivedViewController
- (void)viewDidLoad
{
[superviewDidLoad];
if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
}
@end
而後你之後全部的 ViewController 都從這個 DerivedViewController 類繼承。
但不幸的是,咱們的程序仍然有大量 iOS<7 的用戶 ,咱們沒法當即拋棄對 iOS 6 的支持。不管 edgesForExtendedLayout 仍是UIRectEdgeNone,都只能在 iOS7 下有效。對於 iOS 6,我將以上代碼修改成:
- (void)viewDidLoad
{
[superviewDidLoad];
#if__IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
#else
float barHeight =0;
if (!isIPad()&& ![[UIApplication sharedApplication] isStatusBarHidden]) {
barHeight+=([[UIApplication sharedApplication]statusBarFrame]).size.height;
}
if(self.navigationController &&!self.navigationController.navigationBarHidden) {
barHeight+=self.navigationController.navigationBar.frame.size.height;
}
for (UIView *viewin self.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height - barHeight);
} else {
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height);
}
}
#endif
}
經過宏 __IPHONE_OS_VERSION_MAX_ALLOWED 判斷 deployment target 是否 >7.0。>7.0則使用新的 edgesForExtendedLayout API,負責使用比較笨的方法逐個下移 subviews,並自動根據狀態欄/導航欄的可視狀態計算要移動的偏移量。
注:若是已升級至Xcode5,將導航控制器的 Top Bar 設置爲一種「Opacque ...」(不透明)類型可解決此問題。