怎麼讓self.view的Y從navigationBar下面開始計算

小溪彼岸發表於2016-06-21

原文地址:http://blog.sina.com.cn/s/blog_1410870560102wu9a.html

在iOS 7中,蘋果引入了一個新的屬性,叫做[UIViewController setEdgesForExtendedLayout:],它的預設值為UIRectEdgeAll。當你的容器是navigation controller時,預設的佈局將從navigation bar的頂部開始。這就是為什麼所有的UI元素都往上漂移了44pt。有時會加上頂部tool bar的高度 20, 20+44 = 64。而且下面tabbar也縮排的49

解決辦法

- (void)viewDidLoad  
{  
    [super viewDidLoad];  
    // Do any additional setup after loading the view.  
    if (OSVersionIsAtLeastiOS7()) {  
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])  
        {  
            self.edgesForExtendedLayout = UIRectEdgeNone;  
        }  
    }  
}  

如果設定成 self.edgesForExtendedLayout = UIRectEdgeBottom;那麼就會self.view.frame是從navigationBar下面開始計算一直到螢幕底部;
如果設定成 self.edgesForExtendedLayout = UIRectEdgeNone;那麼就會self.view.frame是從navigationBar下面開始計算一直到螢幕tabBar上部;
如果設定成 self.edgesForExtendedLayout = UIRectEdgeTop;那麼就會self.view.frame是從navigationBar上面計算面開始計算一直到螢幕tabBar上部;

iOS7以上系統,self.navigationController.navigationBar.translucent預設為YES,self.view.frame.origin.y從0開始(螢幕最上部)。
此時若是新增程式碼self.edgesForExtendedLayout = UIRectEdgeNone(iOS7.0以後方法);self.view.frame.origin.y會下移64畫素至navBar下方開始。但是此時當push到一個新的controller之前給當前螢幕截圖的時候[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];,由於navBar是透明的,會出現64畫素的黑色區域。

此時只需要把self.navigationController.navigationBar.translucent=NO即可,不需要加程式碼self.edgesForExtendedLayout;

iOS7之後也增加了一個self.tabBarController.tabBar.translucent的屬性,預設為YES。當應用同時使用navBar和TabBar的時候。設定self.tabBarController.tabBar.translucent=NO並且self.navigationController.navigationBar.translucent=NO時候,得到self.view.frame—>{{0, 64}, {320, 455}}。檢視的高度也改變為navBar和tabBar之間的455畫素。當self.navigationController.navigationBar.translucent=YES並且self.tabBarController.tabBar.translucent=NO的時候self.view.frame—>{{0, 0}, {320, 519}};其都為YES的時候self.view.frame—>{{0, 0}, {320, 568}};

注意:設定self.edgesForExtendedLayout = UIRectEdgeNone;的時候會使得navBar和tabBar都不佔空間。self.view.frame—>{{0, 64}, {320, 455}}。此時iOS7預設navBar和tabBar都是透明的。截圖的時候需要注意。

iOS6以下系統,預設navBar和tabBar都不佔空間。

相關文章