Zeige UITabBar, wenn UIViewController gedrückt wurde

8

Hier ist meine Situation:
Ich habe ein UINavigationController in einem UITabBarController . Wenn ich den Navigationscontroller aufreiße, muss ich irgendwann UITabBar ausblenden, weil ich möchte, dass die Ansicht so viel Platz wie möglich hat.
Ich mache das, indem ich self.hidesBottomBarWhenPushed = YES in der gedrückten UIViewController benutze, und es funktioniert ziemlich gut.
Ich möchte jedoch die UITabBar in den folgenden Push-Controllern anzeigen. Ich habe versucht, self.hidesBottomBarWhenPushed = NO in die anderen Controller zu setzen, aber die UITabBar wird nicht zurückkommen.

Es scheint 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.

Wenn der Controller mit dieser Eigenschaft auf Ja gesetzt wird, kommt die Tableiste tatsächlich zurück.

Gibt es eine geeignete Methode, UITabBar anzuzeigen, wenn ein Controller gedrückt wird, nachdem er ausgeblendet wurde?

Vielen Dank im Voraus

    
kombucha 21.02.2011, 23:16
quelle

3 Antworten

6

Okay, hier haben wir einen sehr langen Weg vor uns.

Wie Sie aus dem Dokument lesen, ist das Standardverhalten klar: Sobald die Eigenschaft hides... eines View-Controllers auf YES gesetzt ist, wird die Tab-Leiste ausgeblendet, bis der View-Controller aufgerufen wird. Was Sie wollen, widerspricht dem direkt, und aus verschiedenen Gründen würde ich zuerst empfehlen, diesen Ansatz nicht zu wählen.

Es bedeutet jedoch nicht, dass es nicht implementiert werden kann.

  • Festlegen der Eigenschaft hides... zurück auf NO

Sie können das Standardverhalten nicht ändern. Um die Registerkartenleiste anzuzeigen, müssen alle View-Controller im Stack die Eigenschaft hides... auf NO setzen. In der Ansicht, in der die Registerkartenleiste ausgeblendet ist, müssen Sie die hides... -Eigenschaft des vorherigen Ansichtscontrollers wieder auf NO zurücksetzen, wenn Sie die Leiste erneut anzeigen möchten, wenn eine neue Ansicht angezeigt wird.

Kurz bevor Sie einen neuen View-Controller drücken, setzen Sie die Eigenschaft zurück auf NO.

%Vor%

Damit haben Sie wieder die Tab-Leiste. Sie werden jedoch feststellen, dass die Tab-Leiste von links gedrückt wird, während die neue Ansicht von rechts gedrückt wird. Dies ist eindeutig nicht wünschenswert, also müssen wir das beheben.

  • Überschreiben der Ebenenaktion für die Tab-Leiste

Die Sache ist, die Standard-Ebenen-Aktion (die Animation), die verwendet wird, wenn die Tab-Leiste wieder erscheint, ist eine Push-Übergangs-Animation von links. UITabBar implementiert die Methode - (id < CAAction >)actionForLayer:(CALayer *)layer forKey:(NSString *)key , die angibt, dass die Animation von links für den Fall verwendet werden soll. Wir müssen diese Methode überschreiben, um stattdessen eine Animation von rechts zurückzugeben.

Um die Tab-Leiste wieder anzuzeigen, ändert Cocoa die Eigenschaft position der Ebene. Daher sollte unsere neue Methode eine Animation von rechts für den Schlüssel position zurückgeben, und für alle anderen Schlüssel sollte sie die Standardimplementierung verwenden. Beachten Sie, dass die Verwendung von position für die Registerkartenleiste nicht von Apple dokumentiert wird. Daher kann es in den folgenden Versionen ohne vorherige Ankündigung geändert werden. Wir implementieren etwas, das sowieso direkt der Spezifikation von Apple widerspricht, also kann nicht viel beschweren.

Sie können Subclassing jedoch nicht einfach verwenden, um die Methode zu überschreiben. Selbst wenn Sie eine benutzerdefinierte Unterklasse von UITabBar haben, können Sie die UITabBarController-Klasse nicht ändern, um sie anstelle der Standard-UITabBar zu verwenden.

Also, es wird ein bisschen komplexer. Um Ihre eigene Logik in die UITabBar-Klasse zu integrieren, müssen Sie die Implementierung für die Nachricht actionForLayer: forKey: austauschen.

Fügen Sie zuerst eine neue Methode zur UITabBar-Klasse mithilfe der Kategorie hinzu.

%Vor%

Fügen Sie in der viewDidAppear -Methode des Tab-Bar-Controllers die folgenden Codes ein.

%Vor%

Sie möchten dies in viewDidAppear anstatt in viewDidLoad machen, da sonst die Tableiste bei der ersten Anzeige der Anwendung von rechts eingeblendet wird.

Wenn eine UITabBar-Instanz jetzt eine Nachricht actionsForLayer forKey: erhält, wird die benutzerdefinierte Methode customActionForLayer forKey: aufgerufen. Er fängt den Schlüssel position ab und gibt eine Animation von rechts zurück. Wenn es sich um einen anderen Schlüssel handelt, ruft es die ursprüngliche Implementierung der Nachricht auf, die jetzt mit der Nachricht defaultActionsForLayer forKey: verbunden ist.

Okay, da sind wir. Denken Sie daran, dass beim Zurücksetzen der Ansichten möglicherweise die hides... -Eigenschaft wieder auf YES gesetzt werden muss, da Sie sie beim Verschieben einer neuen Ansicht auf NO setzen (und ähnliche Tricks anwenden, um sie richtig zu animieren).

Ich habe einige Zeit damit verbracht, aber ironisch gesagt, muss ich sagen * Benutze das nicht mehr , da es eine undokumentierte Information von Cocoa-Klassen verwendet ("position" -Schaltfläche für die Tab-Balken-Animation) ) widerspricht den dokumentierten Verhaltensweisen und ist gegen Apples Human Interface Guideline. Möglicherweise stellen Sie fest, dass Ihre Anwendung mit den folgenden SDK-Versionen nicht identisch ist, dass die Benutzer die Benutzeroberfläche nicht problemlos übernehmen können oder dass Apple Ihre Anwendung im App Store ablehnt.

Was ist dann meine Antwort? Nun, ein Beispiel für einige interessante Themen zur Entwicklung von iOS, denke ich (und ein Beweis dafür, dass ich heute schrecklich unproduktiv bin: P).

    
MHC 22.02.2011, 04:48
quelle
13

hidesBottomBarWhenPushed ist nicht veraltet. Ich fand es sehr einfach, das Verstecken zu erreichen und UITabBar mit der folgenden Methode anzuzeigen:

%Vor%

Nachdem Sie also den detailViewConroller gedrückt haben, sollten Sie die hide-Eigenschaft zurück auf NO setzen. Auf diese Weise wird es wieder angezeigt, wenn die Detailansicht angezeigt wird. keine zusätzlichen Änderungen in viewWillApear / disapear, etc .. Genießen.

    
AmitP 15.07.2012 13:08
quelle
4

Hier ist mein Ansatz, wenn ich Storyboards in iOS 5 verwende:

Setzen Sie die Eigenschaft hidesBottomBarWhenPushed auf NO , bevor Sie das Push-Segment ausführen:

%Vor%

Es liegt natürlich an Ihnen, den Namen des Segments zu benennen.

Setzen Sie es sofort wieder auf YES , wenn die View-Controller-Ansicht verschwindet:

%Vor%

Funktioniert wie ein Zauber (getestet auf iOS 5.1) mit den richtigen Animationen für UITabBar .

    
Michael Thiel 27.07.2012 10:32
quelle