34

UITabBarControllerデフォルトのView ControllerがUINavigationController. で特定のビューをプッシュしたときに、 UITabBarController の UITabBar を非表示にできるようにしたいと考えていUINavigationControllerます。

私は追加しようとしました:

delegate.tabBarController.hidesBottomBarWhenPushed = YES;

ビューをプッシュする前に、UINavigationControllerそれはうまくいかないようです。

私が何をすべきか、またはそれが可能かどうかについてのヒントはありますか? 前もって感謝します!

4

9 に答える 9

105

これの方が良い:

viewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:viewController animated:YES];

ビューにプッシュするコントローラーで hidesBottomBarWhenPushed = YES を設定する必要があります...

于 2009-11-09T17:08:57.453 に答える
4

ストーリーボードで作業する場合、プッシュ時にタブバーを非表示にする設定が簡単なビュー コントローラーです。目的のビュー コントローラーで、このチェックボックスを選択するだけです。
ここに画像の説明を入力

于 2015-02-28T22:28:51.353 に答える
3

これを解決する方法を理解しました。同じ問題が発生していましたが、Appleは「TheElements」(http://developer.apple.com/library/ )というサンプルでそれを行う方法も教えてくれます。 ios /#samplecode / TheElements / Introduction / Intro.html

それを行う方法については、以下の関数を参照してください。これを、プッシュしたいビューのinit関数に追加してください。

-(id) init { 
    if(self = [super init]) { 
        self.hidesBottomBarWhenPushed = YES; 
    } 
    return self; 
}

写真アプリがiPhoneで行うように、タブバーは自動的に非表示になります。また、戻ると、親ビューにタブバーが再び表示されます。

幸運を

于 2011-12-13T10:53:35.207 に答える
3

提案された解決策のほとんどを試しました。結局、どれも私のために働いていませんでした。

hideTabBarWhenPushed は、次にプッシュされるビュー コントローラーだけでなく、プッシュされるすべてのビュー コントローラーのタブ バーを非表示にします。タブバーコントローラーを再表示したかった人のために。

Orafaelreis のソリューション (上記参照) は、それに最も適しているように見えました。しかし、彼の試みは厳密な縦向きでしか機能せず、上下逆さまでも機能しませんでした。だから私はそれを直さなければなりませんでした。これは私が最終的に得たものです:

#define kTabBarHeight               49 // This may be different on retina screens. Frankly, I have not yet tried.

- (void) hideTabBar:(BOOL)hide {

    // fetch the app delegate
    AppDelegate         *delegate   = [[UIApplication sharedApplication] delegate];

    // get the device coordinates
    CGRect              bounds      = [UIScreen mainScreen].bounds;
    float               width;
    float               height;

    // Apparently the tab bar controller's view works with device coordinates  
    // and not with normal view/sub view coordinates
    // Therefore the following statement works for all orientations. 
    width                   = bounds.size.width;
    height                  = bounds.size.height;

    if (hide) {

        // The tab bar should be hidden too. 
        // Otherwise it may flickr up a moment upon rotation or 
        // upon return from detail view controllers. 
        [self.tabBarController.tabBar setHidden:YES];

        // Hiding alone is not sufficient. Hiding alone would leave us with an unusable black
        // bar on the bottom of the size of the tab bar. 
        // We need to enlarge the tab bar controller's view by the height of the tab bar. 
        // Doing so the tab bar, although hidden, appears just beneath the screen. 
        // As the tab bar controller's view works in device coordinations, we need to enlarge 
        // it by the tab bar height in the appropriate direction (height in portrait and width in landscape)
        // and in reverse/upside down orientation we need to shift the area's origin beyond zero. 
        switch (delegate.tabBarController.interfaceOrientation) {
            case UIInterfaceOrientationPortrait:
                // Easy going. Just add the space on the bottom.
                [self.tabBarController.view setFrame:CGRectMake(0,0,width,height+kTabBarHeight)];
                break;

            case UIInterfaceOrientationPortraitUpsideDown:
                // The bottom is now up! Add the appropriate space and shift the rect's origin to y = -49
                [self.tabBarController.view setFrame:CGRectMake(0,-kTabBarHeight,width,height+kTabBarHeight)];
                break;

            case UIInterfaceOrientationLandscapeLeft:
                // Same as Portrait but add the space to the with but the height
                [self.tabBarController.view setFrame:CGRectMake(0,0,width+kTabBarHeight,height)];
                break;

            case UIInterfaceOrientationLandscapeRight:
                // Similar to Upside Down: Add the space and shift the rect. Just use x and with this time
                [self.tabBarController.view setFrame:CGRectMake(0-kTabBarHeight,0,width+kTabBarHeight,height)];
                break;

            default:
                break;
        }
    } else {
        // reset everything to its original state. 
        [self.tabBarController.view setFrame:CGRectMake(0,0,width,height)];
        [self.tabBarController.tabBar setHidden:NO];
    }

    return; 
}


- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{

    // It is important to call this method at all and to call it here and not in willRotateToInterfaceOrientation
    // Otherwise the tab bar will re-appear. 
    [self hideTabBar:YES];

    // You may want to re-arrange any other views according to the new orientation
    // You could, of course, utilize willRotateToInterfaceOrientation instead for your subViews. 
}

- (void)viewWillAppear: (BOOL)animated { 

    // In my app I want to hide the status bar and navigation bar too. 
    // You may not want to do that. If so then skip the next two lines. 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

    [self hideTabBar: YES];

    // You may want to re-arrange your subviews here. 
    // Orientation may have changed while detail view controllers were visible. 
    // This method is called upon return from pushed and pulled view controllers.   

    return;
}

- (void)viewWillDisappear: (BOOL)animated {     

    // This method is called while this view controller is pulled
    // or when a sub view controller is pushed and becomes visible
    // Therefore the original settings for the tab bar, navigation bar and status bar need to be re-instated

    [self hideTabBar:NO];

    // If you did not change the appearance of the navigation and status bar in viewWillAppear,
    // then you can skip the next two statements too. 
    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];

    return;
}

インライン コメントでは、各ステートメントの理由を説明する必要があります。ただし、それをコーディングするよりスマートな方法があるかもしれません。

ステータス バーとナビゲーション バーを非表示にすることにも関連する副作用が 1 つありますが、これは隠したくありません。1. このナビゲーション コントローラーから呼び出し元のナビゲーション コントローラーに戻るとき、呼び出し元のコントローラーのステータス バーとナビゲーション バーは、デバイスが 1 回回転するか、別のタブが前面に表示された後に関連するタブが再度選択されるまで重なります。2. 呼び出し元のビュー コントローラーがテーブル ビューであり、テーブルに戻るときにデバイスがランドスケープ モードの場合、テーブルはランドスケープに適した向きで表示されますが、縦向きのようにレイアウトされます。左上隅は問題ありませんが、一部のテーブル セルとタブ バーが画面の下に隠れています。右側に空きスペースがあります。これも、デバイスを再度回転させることで修正されます。

これらのマイナーだが厄介なバグの解決策を見つけたら、最新情報をお知らせします.

于 2012-01-07T18:49:33.323 に答える
2

これを機能させる方法は次のとおりです。

Application Delegateを作成しUITabBarControllerます。次にUINavigationController、特定のタブで必要なビュー コントローラーとしてルート コントローラーを使用して を作成します。次に、UINavigationControllerを の「viewControllers」配列に挿入しUITabBarControllerます。そのようです:

ViewControllerForTab1 *tab1Controller = [[ViewControllerForTab1 alloc] initWithNibName:@"ViewControllerForTab1"];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tab1Controller];

[tab1Controller release];


UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = [NSArray arrayWithObjects: navController, nil];

[navController release];


[self.window addSubView:tabBarController.view];

このようにして、その中の任意のビュー コントローラでhidesBottomBarWhenPushed" " プロパティを " " に設定でき、.YESUINavigationControllerUITabBar

それが役立つことを願っています!

于 2011-02-02T19:46:54.920 に答える
1

これに対する私の解決策をここに示します。

#define FRAME_HIDDEN CGRectMake(0, 0, 768, 1073) //1073 = 1024 (screen) + 49 (UITabBar) 
#define FRAME_APPEAR CGRectMake(0, 0, 768,1024)

-(void) setHidden: (BOOL) hidden{
    CGRect frame = (hidden)? FRAME_HIDDEN : FRAME_APPEAR;
    [self.tabBarController.view setFrame:frame];
    [self.tabBarController.tabBar setHidden:hidden];
}

必要な場所で「setHidden」メソッドを呼び出します! これと「シングルトンパターン」を使用すると、サブビューは彼のスーパービューで UITabBar を非表示にできます

于 2011-12-02T17:03:07.910 に答える