Ich habe ein Problem mit UITabBarController
. In meiner Anwendung möchte ich es ausblenden, aber ohne es zu verwenden, hidesBottomBarWhenPushed
da 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.
iphone
ios
uitabbarcontroller
Viktor Apoyan
quelle
quelle
Antworten:
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]; }
quelle
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.
quelle
- 49.0
bei dem dietabbarcontroller.tabBar.frame.size.height
Wahrscheinlichkeit geringer ist, dass zukünftige iOS-Versionen beschädigt werden.In Ihrer Aktionsmethode für die Schaltfläche:
[self.tabBarController.tabBar setHidden:YES];
quelle
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];
quelle
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
431
und271
.quelle
@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]; }
quelle
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(); }
quelle
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!
quelle
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
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
einen Schnappschuss von UITabBar zu machen ;
Fügen Sie das UIImage des Snapshots zu UIImageView hinzu , das denselben Frame wie UITabBar hat.
Ändern Sie die Größe der zugrunde liegenden Ansicht und platzieren Sie sie in self.tabBarController.view .
set UITabBar ‚s alpha zu 0,0;
Platzieren Sie die UIImageView mit dem UITabBar -Snapshot in der self.tabBarController.view .
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; }
quelle
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]; } } }
quelle
In iOS8 reicht es aus, nur die
hidden
Eigenschaft vontabBar
Like in Swift festzulegen, die Sie können
rootTabVC = UITabBarController() rootTabVC?.tabBar.hidden = true
Ich tue dies in meiner
didFinishLaunchingWithOptions
in demappdelegate
und es funktioniert gut, ich glaube , wenn ich mich richtig in den älteren iOS - Versionen erinnern Sie sich auch die festlegen benötigenframe
dentabBar
etwas außerhalb des Bildschirms, da sonst dastabbar
würde nicht zeigen , aber es wird noch besetzt den Raum.quelle
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) }
quelle
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) } } }) } }) } }
quelle
Bei einer schnellen Version mit Animation müssen Sie
isHideTabBar
selbst 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))! })
quelle
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.
quelle