2012-08-29 115 views
0

如何以編程方式隱藏UITabBar?它被要求,並回答了在SO多次,但答案似乎都在大約兩個品種:橫向隱藏UITabBar

1)使用導航控制器,一個可以隱藏使用hidesBottomBarWhenPushed財產推前下一個VC的標籤欄。 Typical answer here

2)瀏覽標籤欄控制器的視圖層次並修改標籤欄的框架和/或可視性。 Typical answer here

但兩種答案都不盡人意,imo。 1)如果我們需要隱藏所在視圖上的標籤欄,例如在旋轉到橫向時會發生什麼情況? 2)通過Apple庫的私有視圖層次結構喚醒的代碼半頁是a。煩瑣,b。容易發生斷裂,c。可能是應用程序批准的攔截器。

那麼應用程序要做什麼?答案是不允許的?有一個蘋果文件參考文件支持嗎?這將是一個令人難過的答案。 Imo,旋轉情況是隱藏標籤欄的合法理由。

在此先感謝您的幫助。

+0

如果這個問題在我今晚下班的時候沒有回答,我很樂意分享我的代碼,這些代碼完全符合您的需求。花了我一些搜索,並嘗試使其實際工作。在我的應用程序中,我旋轉到橫向以隱藏標籤欄和導航欄,並顯示全屏地圖UI元素。如果仍然需要,我會稍後發佈。 – Brayden

+0

那會很棒。謝謝。 – danh

回答

0

你可以找到一些有用的代碼here。你可以從你應該調用hideTabbar:方法

+0

謝謝。是的,這是我發佈的鏈接,作爲一個不是特別好的解決方案的例子。 – danh

1

對不起,延遲響應,但我拉了我的代碼,你可以看到我如何旋轉我的設備,以僅在橫向全屏顯示'地圖視圖'。

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
    [self hideTabBar:self.tabBarController]; 
    [self.view bringSubviewToFront:self.eventsMapView]; 
    self.eventsMapView.bounds = self.view.bounds; 
    self.eventsMapView.frame = CGRectMake(0, -208, self.view.frame.size.width, 300); 
} else if(toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || toInterfaceOrientation == UIInterfaceOrientationPortrait) { 
    [self showTabBar:self.tabBarController]; 
    [self.view sendSubviewToBack:self.eventsMapView]; 
} 

}

而且,由於我們稱之爲內的方法實際上隱藏和顯示標籤欄,我們需要定義我們的.m文件的方法,以及:

#pragma mark - Tab Bar Methods - 

-(void)hideTabBar:(UITabBarController *)tabbarcontroller { 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 

    for(UIView *view in tabbarcontroller.view.subviews) { 
     if([view isKindOfClass:[UITabBar class]]) { 
      [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)]; 
     } else { 
      [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)]; 
     } 
    } 

    [UIView commitAnimations]; 
} 

-(void)showTabBar:(UITabBarController *)tabbarcontroller {  
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 

    for(UIView *view in tabbarcontroller.view.subviews) { 
     if([view isKindOfClass:[UITabBar class]]) { 
      [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)]; 
     } else { 
      [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)]; 
     } 
    } 

    [UIView commitAnimations]; 
} 

如果你已經在一個標籤欄控制器中,那麼你需要確保每個孩子(或單獨的標籤ViewController)返回TRUE像下面的方向。

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return TRUE; 

}

希望這有助於 - 如果您有任何問題發表評論,我會更新我的答案炫耀更好。

+0

+1分享一個可行的答案,但我認爲它屬於我提到的第二類不足解決方案,因爲它直接操縱系統的私有層次。謝謝! – danh

+1

如果你願意直接觸摸標籤欄,這裏有幾條建議可以改善你發佈的代碼:1)從沒有搜索的位置獲取tabBar - 從一個包含的視圖控制器,你可以說:tabBar = self.tabBarController.tabBar。 2)使用[UIView animateWithDuration ...方法獲得更清晰的動畫代碼,3)避免像這樣在框架中使用文字浮動:tabBar.frame = CGRectOffset(tabBar.frame,0.0,sign * tabBar.frame.size.height);其中符號是+1隱藏和-1顯示。 – danh