So verstecken Sie uitabbarcontroller

75

Ich habe ein Problem mit UITabBarController. In meiner Anwendung möchte ich es ausblenden, aber ohne es zu verwenden, hidesBottomBarWhenPushedda ich es nicht ausblenden möchte, wenn ich es gedrückt habe. Zum Beispiel möchte ich es ausblenden, wenn ich in meiner Anwendung auf die Schaltfläche Ausblenden drücke.

Ich habe viele Artikel in Google gelesen, kann aber nicht herausfinden, wie ich das tun kann.

Viktor Apoyan
quelle

Antworten:

149

Ich füge dies aus meinem Arbeitscode ein. Sie können diese Methoden aufrufen, um den tabbarcontroller auszublenden und anzuzeigen. Übergeben Sie einfach die tabbarcontroller-Instanz an diese Funktionen.

// Method call
[self hideTabBar:self.tabBarController];   

// Method implementations
- (void)hideTabBar:(UITabBarController *) tabbarcontroller
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];

    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.5];
    for(UIView *view in tabbarcontroller.view.subviews)
    {
        NSLog(@"%@", view);

        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]; 
}
Saurabh
quelle
erlaubt Apple es dir? Ich meine, Tabbar sollte schreibgeschützt sein. Ich frage mich nur, ob meine App abgelehnt wird
mateusmaso
3
Ich versuche für diese Lösung. Wenn Sie die Methode hideTabbar () aufrufen, ist meine Registerkartenleiste ausgeblendet, zeigt jedoch unten einen schwarzen Bereich an (positionieren Sie dieselbe Registerkartenleiste). Wie kann ich das beheben?
Thunderbird
58

Die Antwort von Setomidor wurde geändert, um sowohl im Quer- als auch im Hochformat und auf dem iPad zu funktionieren (die Werte 320 und 480 funktionieren nur auf dem iPhone).

- (void) hideTabBar:(UITabBarController *) tabbarcontroller 
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    float fHeight = screenRect.size.height;
    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
    {
        fHeight = screenRect.size.width;
    }

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



- (void) showTabBar:(UITabBarController *) tabbarcontroller 
{   
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height - tabbarcontroller.tabBar.frame.size.height;

    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
    {
        fHeight = screenRect.size.width - tabbarcontroller.tabBar.frame.size.height;
    }

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in tabbarcontroller.view.subviews)
    {   
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];            
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
        }       
    }
    [UIView commitAnimations]; 
}

Außerdem wurde der Code geändert, um in iOS 6 eingeführte Änderungen mit Änderungen der UIDevice-Ausrichtung zu verarbeiten und sicherzustellen, dass er auch dann ordnungsgemäß funktioniert, wenn das Gerät auf dem Rücken liegt.

karlbecker_com
quelle
10
Sie sollten für saubereren Code ersetzen, - 49.0bei dem die tabbarcontroller.tabBar.frame.size.heightWahrscheinlichkeit geringer ist, dass zukünftige iOS-Versionen beschädigt werden.
Ethan Allen
34

In Ihrer Aktionsmethode für die Schaltfläche:

[self.tabBarController.tabBar setHidden:YES];
Sailesh
quelle
2
Diese Methode funktioniert in iOS 7, aber in iOS 6 bleibt eine große Lücke, wo sich die Registerkartenleiste befand.
Danyal Aytekin
Bei iOS 13.3 hat es nicht funktioniert - verschwindet, lässt aber Leerzeichen.
Nikolay Suvandzhiev
Haben Sie versucht, die "underOpaqueBars" und andere unter Sachen in der Ansicht Controller-Info
Moose
12

Die Lösungen von Saurahb und karlbecker_com sind großartig, obwohl sie einen offensichtlichen Popping-Effekt verursachen können, wenn die Ansicht eine Tabellenansicht enthält, während die Registerkartenleiste eine Sicherungskopie erstellt . Ich habe einige Änderungen vorgenommen und sie zu einer einzigen Funktion zusammengefasst (als Kategorie in UITabBarController). Es ist nicht ganz perfekt (verzögerte Korrekturanimation), liefert aber gute Ergebnisse mit Tabellen.

Wenn Sie Animationsblöcke und Kategorien mögen, probieren Sie dies aus. Orientierung und gerätefreundlich.

UITabBarController + ShowHideBar.m:

#import "UITabBarController+ShowHideBar.h"

@implementation UITabBarController (ShowHideBar)

- (void) setHidden:(BOOL)hidden{

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height;
    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ){
        fHeight = screenRect.size.width;
    }

    if(!hidden) fHeight -= self.tabBar.frame.size.height;

    [UIView animateWithDuration:0.25 animations:^{
        for(UIView *view in self.view.subviews){
            if([view isKindOfClass:[UITabBar class]]){
                [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
            }else{
                if(hidden) [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
            }
        }
    }completion:^(BOOL finished){
        if(!hidden){

            [UIView animateWithDuration:0.25 animations:^{

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

            }];
        }
    }];

}

@end

UITabBarController + ShowHideBar.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (ShowHideBar)

- (void) setHidden:(BOOL)hidden;

@end

Verwendung:

[self.tabBarController setHidden:YES];
[self.tabBarController setHidden:NO];
Thomas Verbeek
quelle
9

Saurabhs Antwort oben kann erweitert werden, um auch im Querformat zu arbeiten:

+ (void) hideTabBar:(UITabBarController *) tabbarcontroller {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];

    //Support for landscape views
    int orientation = [[UIDevice currentDevice] orientation];
    int x_pos = 480;
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        x_pos = 320;
    }

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

`

Die entsprechenden x_pos-Nummern für showTabBar () sind 431und 271.

Setomidor
quelle
4

@karlbecker_com Answer funktioniert sowohl für das iPhone 4 als auch für das iPhone 5. Wenn jemand Probleme mit dem schwarzen Balken von iOS7 unten hat, setzen Sie den tabBarController auf durchscheinend

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

// To Hide the black line in IOS7 only, this extra bit is required
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
    [self.tabBarController.tabBar setTranslucent:YES];
}  
mikemike396
quelle
4

Dies ist die Antwort von karlbecker_com, portiert auf MonoTouch (Xamarin.iOS). Der einzige Unterschied besteht darin, dass ich die Methoden für eine Klasse implementiert habe, die von UITabBarController erbt, sodass Verweise auf " tabbarcontroller" durch " this" ersetzt wurden.

public void HideTabBar()
{
    var screenRect = UIScreen.MainScreen.Bounds;
    float fHeight = screenRect.Height;
    if(UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeLeft
       || UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeRight)
    {
        fHeight = screenRect.Width;
    }

    UIView.BeginAnimations(null);
    UIView.SetAnimationDuration(0.4);
    foreach(UIView view in this.View.Subviews)
    {
        if(view is UITabBar)
        {
            view.Frame = new RectangleF(view.Frame.X, fHeight, view.Frame.Width, view.Frame.Height);
        } 
        else 
        {
            view.Frame = new RectangleF(view.Frame.X, view.Frame.Y, view.Frame.Width, fHeight);
            view.BackgroundColor = UIColor.Black;
        }
    }
    UIView.CommitAnimations();
}

public void ShowTabBar()
{   
    var screenRect = UIScreen.MainScreen.Bounds;
    float fHeight = screenRect.Height - 49f;
    if(UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeLeft
       || UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeRight)
    {
        fHeight = screenRect.Width - 49f;
    }

    UIView.BeginAnimations(null);
    UIView.SetAnimationDuration(0.4);
    foreach(UIView view in this.View.Subviews)
    {
        if(view is UITabBar)
        {
            view.Frame = new RectangleF(view.Frame.X, fHeight, view.Frame.Width, view.Frame.Height);
        } 
        else 
        {
            view.Frame = new RectangleF(view.Frame.X, view.Frame.Y, view.Frame.Width, fHeight);
        }
    }
    UIView.CommitAnimations();
}
Diego
quelle
4

Seit IOS 7.1 "Swift" -Lösungen:

self.tabBarController?.tabBar.hidden = true // hide tabbar
self.tabBarController?.tabBar.hidden = false // show tabbar

Hoffe das könnte helfen!

Sifeng
quelle
1
Dadurch wird der Inhaltsbereich der View Controller jedoch nicht angepasst. Lässt einen freien Bereich.
tcurdt
3

Sie können einen Modal View Controller drücken

[self presentModalViewController:myFullscreenViewController animated:YES];

Dadurch wird eine völlig neue Vollbildansicht über Ihrer aktuellen Ansicht erstellt.

entlassen ist mit dismissModalViewController:animated:


quelle
3

Die folgende Lösung funktioniert für mich in genau demselben Anwendungsfall, in dem ich mit TabBar-Animation in den Vollbildmodus wechseln muss.

Grundsätzlich ist die Idee

  1. einen Schnappschuss von UITabBar zu machen ;

  2. Fügen Sie das UIImage des Snapshots zu UIImageView hinzu , das denselben Frame wie UITabBar hat.

  3. Ändern Sie die Größe der zugrunde liegenden Ansicht und platzieren Sie sie in self.tabBarController.view .

  4. set UITabBar ‚s alpha zu 0,0;

  5. Platzieren Sie die UIImageView mit dem UITabBar -Snapshot in der self.tabBarController.view .

  6. Sobald dies erreicht ist, führen Sie eine beliebige Animation durch

    #import "QuartzCore/CALayer.h"
    
    @implementation FTBFirstViewController {
       BOOL hidden;
       UIImageView *fakeTabBarImageView;
       UIView *viewToResize;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        //////////////////////////////
        // Create your viewToResize
        //////////////////////////////
        [self.view addSubview:viewToResize];
    
        hidden = NO;
    }
    
    - (void)hideTabBar:(id)sender {
        if (!hidden) {
            //
            // to create the fake UITabBar
            fakeTabBarImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
            UIImage *fakeTabBarImage = [self imageScreenshotFromView:self.tabBarController.tabBar];
            fakeTabBarImageView.image = fakeTabBarImage;
            fakeTabBarImageView.frame = self.tabBarController.tabBar.frame;
            //
            // to resize underlying UIView
            viewToResize.frame = (CGRect){viewToResize.frame.origin.x, viewToResize.frame.origin.y + 20.f, viewToResize.frame.size.width, viewToResize.frame.size.height + fakeTabBarImageView.frame.size.height};
            //
            // to hide real UITabBar
            self.tabBarController.tabBar.alpha = 0.0;
            //
            // to add views in exactly this order
            [self.tabBarController.view addSubview:viewToResize];
            [self.tabBarController.view addSubview:fakeTabBarImageView];
            //
            // do any sort of animation
            [UIView animateWithDuration:0.8 animations:^{
                fakeTabBarImageView.frame = (CGRect){fakeTabBarImageView.frame.origin.x, fakeTabBarImageView.frame.origin.y + fakeTabBarImageView.frame.size.height, fakeTabBarImageView.frame.size};
            }];
    
            hidden = YES;
        } else {
            [UIView animateWithDuration:0.8 animations:^{
                    fakeTabBarImageView.frame = (CGRect){fakeTabBarImageView.frame.origin.x, fakeTabBarImageView.frame.origin.y - fakeTabBarImageView.frame.size.height, fakeTabBarImageView.frame.size};
            } completion:^(BOOL complete){
                self.tabBarController.tabBar.alpha = 1.0;
                [fakeTabBarImageView removeFromSuperview];
                fakeTabBarImageView = nil;
    
                viewToResize.frame = self.view.frame;
                [self.view addSubview:viewToResize];
    
                [fakeTabBarImageView removeFromSuperview];
            }]; 
    
            hidden = NO;
        }
    }
    
    - (UIImage *)imageScreenshotFromView:(UIView *)aView {
        UIImage *viewImage;
    
        UIGraphicsBeginImageContextWithOptions(aView.bounds.size, aView.opaque, [[UIScreen mainScreen] scale]);
        [aView.layer renderInContext:UIGraphicsGetCurrentContext()];
        viewImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return viewImage;
    }
    
Yevhen Dubinin
quelle
3

Ich habe so ziemlich alle diese Antworten ausprobiert, aber keine davon hat für mich funktioniert. Meine App hat einen UITabBarController als Stammansicht und jede Registerkarte hat einen UINavigationController. Einer der UINavigationController verfügt über einen UICollectionViewController als Top View Controller. Wenn der Benutzer ein Element in der UICollectionView auswählt, sollte der Detailansichts-Controller auf den Navigationsstapel verschoben werden. Meine Detailansicht hatte dann unten eine Symbolleiste. Ich wollte nicht, dass die Symbolleiste über der Registerkartenleiste angezeigt wird, da dies doof aussieht und das Wechseln der Registerkartenkontexte in dieser Ansicht nicht erforderlich ist. Ich hätte das wahrscheinlich leicht lösen können, indem ich UIToolbars und UITabBars manuell platziert und UITabBarController und die eingebaute UIToolbar nicht verwendet hätte, aber das schien zu viel Refactoring und ein bisschen unelegant.

Am Ende war meine Lösung ziemlich einfach: Erweitern Sie die Grenzen des UITabBarControllers vom unteren Bildschirmrand. Ich habe dies meinem Detailansichts-Controller hinzugefügt:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Extend the UITabBarController to shift the tab bar off screen
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGRect tabBarControllerFrame = self.tabBarController.view.frame;
    if (animated) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.5];
        tabBarControllerFrame.size.height = screenRect.size.height +
            self.tabBarController.tabBar.frame.size.height;
        [self.tabBarController.view setFrame:tabBarControllerFrame];
        [UIView commitAnimations];
    }
    else {
        tabBarControllerFrame.size.height = screenRect.size.height +
            self.tabBarController.tabBar.frame.size.height;
        [self.tabBarController.view setFrame:tabBarControllerFrame];
    }

    // Now show the toolbar
    [self.navigationController setToolbarHidden:NO animated:animated];
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Ensure the UITabBarController remains extended when subviews are laid out
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGRect tabBarControllerFrame = self.tabBarController.view.frame;
    tabBarControllerFrame.size.height = screenRect.size.height + 
        self.tabBarController.tabBar.frame.size.height;
    [self.tabBarController.view setFrame:tabBarControllerFrame];
}

Um die Registerkartenleiste erneut anzuzeigen, wenn der Benutzer wieder zum oberen Rand meines UINavigationControllers zurückkehrt, habe ich dies meinem Top View Controller hinzugefügt:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Hide toolbar
    [self.navigationController setToolbarHidden:YES animated:animated];

    // Tab bar back on to screen
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGRect tabBarControllerFrame = self.tabBarController.view.frame;
    if (tabBarControllerFrame.size.height != screenRect.size.height) {
        if (animated) {
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0.5];
            tabBarControllerFrame.size.height = screenRect.size.height;
            [self.tabBarController.view setFrame:tabBarControllerFrame];
            [UIView commitAnimations];
        }
        else {
            tabBarControllerFrame.size.height = screenRect.size.height;
            [self.tabBarController.view setFrame:tabBarControllerFrame];
        }
    }
}
SeanR
quelle
3

In iOS8 reicht es aus, nur die hiddenEigenschaft von tabBar
Like in Swift festzulegen, die Sie können

rootTabVC = UITabBarController()
rootTabVC?.tabBar.hidden = true

Ich tue dies in meiner didFinishLaunchingWithOptionsin dem appdelegateund es funktioniert gut, ich glaube , wenn ich mich richtig in den älteren iOS - Versionen erinnern Sie sich auch die festlegen benötigen frameden tabBaretwas außerhalb des Bildschirms, da sonst das tabbarwürde nicht zeigen , aber es wird noch besetzt den Raum.

Ali
quelle
Macht es das nicht einfach unsichtbar? Es ist immer noch da und verhindert das Klicken darunter.
h3dkandi
2

Schnelle und modifizierte Version des @ Saurabh-Codes

Methode

func setTabBarHidden (bool:Bool){
        for view in tabBarController!.view.subviews {
            if (view.isKindOfClass(UITabBar)){
                let tabBar = view as! UITabBar
                UIView.animateWithDuration(0.3, animations: { () -> Void in
                    var offset = CGFloat(50)
                    if (bool == false){
                        offset = -50;
                    }
                    tabBar.frame = CGRect(origin: CGPointMake(tabBar.frame.origin.x, tabBar.frame.origin.y + offset), size: tabBar.frame.size)
             })   
        }
    }
}

Zeigen

override func viewDidLoad() {
     setTabBarHidden(true)
}

Verstecken

override func viewWillDisappear(animated: Bool) {
    setTabBarHidden(false)
}
Husam
quelle
1

Hier ist ein abgespeckter, schneller Port der Version von @Thomas Verbeek für VCs ohne Tabellen (getestet unter iOS 8.4):

extension UITabBarController {

    /**
    Shows or hides the tabbar

    :param: hidden            whether to show or hide the tabbar
    :param: animationDuration the animation's duration
    */
    func setHidden(hidden:Bool, animationDuration:NSTimeInterval = 0.25) {

        let screenRect = UIScreen.mainScreen().bounds
        var fHeight = screenRect.size.height

        if !hidden {
            fHeight -= self.tabBar.frame.size.height
        }

        UIView.animateWithDuration(animationDuration, animations: {
                for view in self.view.subviews as! [UIView] {
                    if view is UITabBar {
                        view.frame = CGRectMake(
                            view.frame.origin.x,
                            fHeight,
                            view.frame.size.width,
                            view.frame.size.height)
                    }
                }
            })
    }
}

Und hier der direktere Port (nicht getestet):

extension UITabBarController {

    /**
    Shows or hides the tabbar

    :param: hidden            whether to show or hide the tabbar
    :param: animationDuration the animation's duration
    */
    func setHidden(hidden:Bool, animationDuration:NSTimeInterval = 0.25) {

        let screenRect = UIScreen.mainScreen().bounds
        var fHeight = screenRect.size.height

        if UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation) {
            fHeight = screenRect.size.width
        }

        if !hidden {
            fHeight -= self.tabBar.frame.size.height
        }

        UIView.animateWithDuration(animationDuration, animations: {
                for view in self.view.subviews as! [UIView] {
                    if view is UITabBar {
                        view.frame = CGRectMake(
                            view.frame.origin.x,
                            fHeight,
                            view.frame.size.width,
                            view.frame.size.height)
                    }
                    else if hidden {
                        view.frame = CGRectMake(
                            view.frame.origin.x,
                            view.frame.origin.y,
                            view.frame.size.width,
                            fHeight)
                    }
                }
            }, completion: { finished in
                if !hidden {
                    UIView.animateWithDuration(animationDuration, animations: {
                        for view in self.view.subviews as! [UIView] {
                            if !(view is UITabBar) {
                                view.frame = CGRectMake(
                                    view.frame.origin.x,
                                    view.frame.origin.y,
                                    view.frame.size.width,
                                    fHeight)
                            }
                        }
                    })
                }
        })
    }
}
dev_does_software
quelle
1

Bei einer schnellen Version mit Animation müssen Sie isHideTabBarselbst eine Eigenschaft festlegen .

self.isHideTabBar = !self.isHideTabBar
UIView.animate(withDuration: 0.5, animations: {
    self.tabBarController?.tabBar.frame = (self.tabBarController?.tabBar.frame.offsetBy(dx: 0, dy: self.isHideTabBar ? 100 : -100))!
 })
William Hu
quelle
0

Das Ausblenden der Registerkartenleiste ist keine adäquate Lösung, da die Ansichtshöhe der aktuellen Ansichtssteuerung nicht angepasst wird.

Stattdessen können Sie einfach die Registerkartenleiste selbst transformieren, entweder anhand ihrer Höhe (zum Ausblenden) oder einer Identitätstransformation, um sie auf sichtbar zurückzusetzen.

extension UITabBarController {
    func setBarHiddenAnimated(_ hidden:Bool) {
        UIView.animate(withDuration: 0.3, animations: {
            if hidden {
                self.tabBar.transform = CGAffineTransform(translationX: 0, y: self.tabBar.frame.size.height)
            } else {
                self.tabBar.transform = CGAffineTransform.identity
            }
        })
    }
}

Beachten Sie, dass Sie Ihren Ansichts-Controller möglicherweise auf "erstreckt sich unter den unteren Balken" und "erstreckt sich unter undurchsichtigen Balken" einstellen müssen, um den schwarzen Hintergrund während der Animation zu entfernen.

cdstamper
quelle