web-dev-qa-db-de.com

Ausblenden der UITabBar beim Drücken einer UIView

Ich habe einen UITabBarControllername__, wobei der Standard-View-Controller ein UINavigationControllerist. Ich möchte in der Lage sein, die UITabBar des UITabBarControllers auszublenden, wenn ich eine bestimmte Ansicht in UINavigationControllerschiebe.

Ich habe versucht, Folgendes hinzuzufügen:

delegate.tabBarController.hidesBottomBarWhenPushed = YES;

in UINavigationControllerbevor ich die Ansicht schiebe, aber das scheint den Trick nicht zu tun.

Irgendwelche Tipps, was ich tun soll oder ob es überhaupt möglich ist? Danke im Voraus!

32
Benny Wong

Das ist besser:

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

Sie müssen hidesBottomBarWhenPushed = YES auf dem Controller setzen, den Sie in die Ansicht verschieben möchten.

95
hfossli

wenn Sie mit Storyboard arbeiten, ist es einfach, den View-Controller einzurichten, der die Tab-Leiste bei Push verdeckt. Auf dem Ziel-View-Controller aktivieren Sie einfach dieses Kontrollkästchen:
enter image description here

4
Ben

Ich habe die meisten Lösungsvorschläge ausprobiert. Am Ende hat keiner von ihnen für mich gearbeitet. 

hideTabBarWhenPushed verbirgt die Registerkartenleiste nicht nur für den als nächstes gestoßenen View-Controller, sondern für alle View-Controller, die darin verschoben werden. Für diese wollte ich, dass der Tab-Leisten-Controller wieder angezeigt wird. 

Die Lösung von Orafaelreis (siehe oben) schien am meisten zu passen. Aber sein Versuch arbeitete nur für strenge Porträtorientierungen, nicht einmal für den Kopf. Also musste ich es reparieren. Das habe ich endlich bekommen: 

#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;
}

Die inline-Kommentare sollten die Begründung für jede Aussage erläutern. Es kann jedoch intelligentere Wege geben, es zu codieren. 

Es gibt einen Nebeneffekt in Verbindung mit dem Ausblenden der Statusleiste und der Navigationsleiste, die ich vor Ihnen nicht verbergen möchte. 1. Wenn Sie von diesem Navigationscontroller zum aufrufenden Navigationscontroller zurückkehren, überlappen sich die Statusleiste und die Navigationsleiste des anrufenden Controllers, bis das Gerät einmal gedreht wird oder bis die entsprechende Registerkarte erneut ausgewählt wird, nachdem eine andere Registerkarte angezeigt wurde. 2. Wenn der aufrufende View-Controller eine Tabellenansicht ist und sich das Gerät im Querformat befindet, wenn Sie zur Tabelle zurückkehren, wird die Tabelle in der entsprechenden Ausrichtung für Querformat angezeigt, jedoch so, als wäre sie im Hochformat. Die obere linke Ecke ist in Ordnung, aber einige Tabellenzellen und eine Tabulatorleiste sind unter dem Bildschirm verborgen. Auf der rechten Seite ist etwas Platz frei. Auch dies wird durch erneutes Drehen des Gerätes behoben. 

Ich werde Sie auf dem Laufenden halten, sobald ich Lösungen für diese kleinen, aber unangenehmen Fehler gefunden habe. 

3
Hermann Klecker

Ich habe herausgefunden, wie man dieses Problem lösen kann. Ich hatte das gleiche Problem, aber Apple erklärt uns auch, wie es in dem Beispiel "The Elements" ( http://developer.Apple.com/ library/ios/# samplecode/TheElements/Einführung/Intro.html )

Sehen Sie sich die Funktion unten an, wie Sie das tun, fügen Sie dies der Init-Funktion der Ansicht hinzu, die Sie hineinschieben möchten!

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

Die Tab-Leiste wird automatisch wie bei der Foto-App auf Ihrem iPhone ausgeblendet. Wenn Sie zurück navigieren, wird in der übergeordneten Ansicht wieder die Tab-Leiste angezeigt.

Viel Glück

3
pikzelz

So bekommen Sie das zum Laufen:

Im Application Delegate legen Sie die UITabBarController an. Dann erstellen Sie eine UINavigationController mit ihrem Root-Controller als den gewünschten View-Controller auf der jeweiligen Registerkarte. Fügen Sie dann die Variable UINavigationController in das Array " viewControllers " der Variable UITabBarController ein. wie so:

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];

Auf diese Weise können Sie die Eigenschaft "hidesBottomBarWhenPushed" in einem beliebigen View-Controller innerhalb dieser YES auf "UINavigationController" setzen und die UITabBar ausblenden. 

Hoffentlich hilft das!

2
Gabriel Vicente

Ich lasse hier meine Lösung dafür:

#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];
}

Ruft die 'setHidden'-Methode dort auf, wo Sie sie benötigen! Wenn ich dies und das 'Singleton Pattern' verwende, kann meine UITabBar in meinen Unteransichten in seinem Superview ausgeblendet werden 

1
orafaelreis

Es stellt sich heraus, dass wenn Sie die Ansicht hidesBottomBarWhenPushed:YES setzen, die Leiste ausgeblendet wird, wenn die Ansicht erscheint (duh meinerseits). Ich habe es der UITabBarController zugewiesen, was nicht viel Sinn macht, wenn Sie darüber nachdenken.

[self.view hidesBottomBarWhenPushed:YES];
[super pushViewController:viewController animated:animated];
0
Benny Wong

Verwenden Sie hidesBottomBarWhenPushed in dem Controller, den Sie ausblenden möchten.

Zum Ausblenden aller Controller in prepare for segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.hidesBottomBarWhenPushed = true
}
0
Haroldo Gondim

im ersten UIViewController "FirstItemViewController"

 @IBAction func pushToControllerAction(sender: AnyObject) {
     self.hidesBottomBarWhenPushed = true
     self.performSegueWithIdentifier("nextController", sender: self)
 }

im nächsten UIViewController "ExampleViewController" `

 override func willMoveToParentViewController(parent: UIViewController?) {
         if parent == nil {
             var viewControllers = self.navigationController!.viewControllers
             if ((viewControllers[viewControllers.count - 2]).isKindOfClass(FirstItemViewController.self)) {
                 (viewControllers[viewControllers.count - 2] as! FirstItemViewController).hidesBottomBarWhenPushed = false
             }
         }
 }

Sehen Sie sich diese Antwort an https://stackoverflow.com/a/36148064/3078925

0
Beslan Tularov