Zeigen UITabBar, wenn UIViewController geschoben
Hier ist meine situation :
Ich habe eine UINavigationController
innerhalb einer UITabBarController
. Wenn ich die drill-down-navigation-controller, irgendwann habe ich zu verbergen, die UITabBar
denn ich möchte die Ansicht so viel Platz wie möglich.
Ich tun, dass durch die Verwendung self.hidesBottomBarWhenPushed = YES
innen geschoben UIViewController
, und es funktioniert ganz gut.
Ich möchte jedoch zeigen die UITabBar
zurück in die folgende geschoben Controller. Ich habe versucht zu setzen self.hidesBottomBarWhenPushed = NO
in die anderen Controller, aber die UITabBar nicht wieder kommen.
Scheint es normal zu sein, wie die Dokumentation besagt :
hidesBottomBarWhenPushed
If YES, the bar at the bottom of the screen is hidden; otherwise, NO. If YES, the bottom bar remains hidden until the view controller is popped from the stack.
Und in der Tat, wenn der controller mit dieser Eigenschaft auf ja festgelegt ist aufgetaucht, der tabbar nicht zurück kommen.
Gibt es eine richtige Art und Weise zu zeigen, die UITabBar
wenn ein Steuergerät betätigt wird, nachdem es versteckt worden?
Vielen Dank im Voraus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, hier haben wir ein sehr langer Weg zu gehen.
Lesen Sie aus dem Dokument, das Standardverhalten ist klar: sobald ein view-controller ist
hides...
Eigenschaft ist JA, die tab-Leiste wird ausgeblendet, bis der view-controller wird geholt. Was wollen Sie direkt widerspricht, und aus verschiedenen Gründen, möchte ich zunächst empfehlen, nicht zu diesem Ansatz.Jedoch, es bedeutet nicht, dass es unmöglich ist, zu implementieren.
hides...
Eigenschaft KEINEKönnen Sie nicht ändern Sie die Standard-Verhalten. Zeigen Sie die tab-bar, alle view-Controller in den stack muss set Ihre
hides...
- Eigenschaft auf NEIN. Also aus der Sicht, wo der tab-Leiste ausgeblendet ist, wenn Sie wollen, um zu zeigen, die bar wieder, wenn eine neue Ansicht abgelegt wird, müssen Sie die vorherigen view-controller isthides...
- Eigenschaft wieder aufNO
wieder.Kurz bevor Sie schieben Sie eine neue view-controller, setzen Sie die Eigenschaft wieder auf NEIN.
Durch, dies zu tun, müssen Sie die tab-Leiste wieder. Jedoch erkennen Sie die tab-Leiste geschoben wird, ist von der linken Seite, während die neue Ansicht abgelegt wird von der rechten Seite. Dies ist klar nicht erwünscht, so müssen wir dieses Problem beheben.
Die Sache ist, die Standard-layer-Aktion (die animation) verwendet, wenn die tab-Leiste wieder erscheint, ist ein push-übergang animation von der linken Seite. UITabBar implementiert
- (id < CAAction >)actionForLayer:(CALayer *)layer forKey:(NSString *)key
Methode, dass man sagt, die animation von der linken Seite der Fall ist. Wir müssen diese Methode überschreiben, um eine animation von rechts statt.Zeigen die tab-Leiste wieder, Kakao ändert seine Ebene
position
Eigenschaft. Daher, unsere neue Methode sollte die Rückkehr einer animation von rechts für den Schlüsselposition
, und für alle anderen Tasten, es sollte die default-Implementierung. Beachten Sie, dass die Verwendungposition
für die tab-Leiste ist nicht dokumentiert von Apple, so ist es vorbehalten, ohne Vorherige Ankündigung in den folgenden Versionen. Wir werden die Umsetzung etwas widerspricht direkt der Apple-Spezifikation sowieso, also kann nicht Klagen viel.Können Sie jedoch nur verwenden Unterklassen diese Methode überschreiben. Denn selbst wenn Sie haben eine benutzerdefinierte Unterklasse von UITabBar, die Sie nicht ändern können UITabBarController-Klasse zu verwenden, anstatt die Standard-UITabBar.
So, es wird ein bisschen komplexer. Um zu implantieren, die Ihre eigene Logik zu UITabBar-Klasse, müssen Sie die Option "swap" die Umsetzung für die Nachricht
actionForLayer: forKey:
.Fügen Sie zunächst eine neue Methode, mit der Klasse UITabBar mit Kategorie.
Und in der
viewDidAppear
Methode der tab-Leiste, controller, fügen Sie die folgenden codes.Wollen Sie tun dies in
viewDidAppear
eher alsviewDidLoad
ist, da sonst die tab-Leiste wird die Folie von rechts in der ersten Zeit der Anwendung zeigt sich.Nun, wenn eine UITabBar-Instanz bekommt eine Nachricht
actionsForLayer forKey:
die benutzerdefinierte MethodecustomActionForLayer forKey:
aufgerufen. Er fängt den Schlüsselposition
, und gibt eine animation von rechts. Wenn es für eine andere Taste, ruft es die ursprüngliche Implementierung der Nachricht, die angeschlossen ist, um die NachrichtdefaultActionsForLayer forKey:
.Okay, da sind wir. Denken Sie daran, wenn Sie knallen wieder die Ansichten, die Sie haben können, um die
hides...
- Eigenschaft wieder auf JA, weil man es NICHT wenn man eine neue Ansicht (und einige ähnliche tricks zu animieren es richtig).Habe ich verbrachte einige Zeit auf diese, aber ironischerweise, ich muss sagen, *verwenden Sie nicht dieses immer wieder, weil es verwendet eine nicht dokumentierte Informationen von Cocoa-Klassen ("position" - Taste für die tab-Leiste "animation"), widerspricht das dokumentierte Verhalten, und ist gegen die Apple human interface guideline. Sie können feststellen, dass Ihre Anwendung würde nicht funktionieren, das gleiche mit dem folgenden SDK-Versionen, dass die Benutzer nicht einfach erlassen, die Schnittstelle oder sogar, dass Apple lehnt Ihre Anwendung im App store.
Dann, was auf der Erde ist meine Antwort für? Gut, ein Beispiel für einige interessante Themen auf der iOS-Entwicklung, ich denke (und einen Beweis zeigen, dass ich bin furchtbar unproduktiv heute :P).
hidesBottomBarWhenPushed
oder nur die Anzeige der Schaltflächen auf der Symbolleiste an anderer Stelle....hidesBottomBarWhenPushed ist nicht veraltet.
Ich fand es sehr einfach zu erreichen, das ein-und ausblenden von UITabBar mit der folgenden Methode:
Also direkt nach dem drücken der detailViewConroller, dann sollten Sie einen reset der ausblenden-Eigenschaft wieder auf NEIN.
Auf diese Weise wird es sich wieder zeigen, wenn die detail-Ansicht erscheint wieder.
keine Notwendigkeit für zusätzliche änderungen in viewWillApear/verschwinden etc..
Genießen.
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { viewController.hidesBottomBarWhenPushed = YES; [super pushViewController:viewController animated:animated]; }
Jetzt, jederzeit schieben Sie eine neue VC, es verstecken der TabBar.Hier ist mein Ansatz, um diese bei der Verwendung von Storyboards in iOS 5:
Legen Sie die
hidesBottomBarWhenPushed
EigenschaftNO
vor der Durchführung der push-segue:Den segue-Bezeichner ist offensichtlich bis zu Ihnen, zu dem Namen.
Legen Sie es zurück zu
YES
sofort, wenn der view controller ist der Ansicht verschwinden:Funktioniert wie ein Charme (getestet unter iOS 5.1) mit all den richtigen Animationen für die
UITabBar
.