Przełączam karty programowo w aplikacji opartej na paskach kart przy użyciu UITabBarController.selectedIndex
. Problem, który próbuję rozwiązać, dotyczy animacji przejścia między widokami. to znaczy. z widoku bieżącej zakładki do widoku wybranej zakładki.
Pierwszą myślą było skorzystanie z opcji UITabBarControllerDelegate
, ale wydaje się, że nie jest ona wywoływana podczas programowego przełączania kart. Rozważam teraz UITabBarDelegate.didSelectItem
: jako możliwy punkt zaczepienia do ustawienia animacji przejścia.
Czy komuś udało się ożywić przejścia? Jeśli tak, w jaki sposób?
ios4
uitabbarcontroller
uitabbar
drekka
źródło
źródło
Odpowiedzi:
Aktualizacja 04/2016: Justed chciał to zaktualizować, aby podziękować wszystkim za wszystkie głosy. Proszę również zauważyć, że zostało to napisane dawno temu, kiedy ... przed ARC, przed ograniczeniami, przed ... wieloma rzeczami! Dlatego proszę wziąć to pod uwagę przy podejmowaniu decyzji o zastosowaniu tych technik. Mogą istnieć bardziej nowoczesne podejścia. Aha, i jeśli znajdziesz. Dodaj odpowiedź, aby wszyscy mogli ją zobaczyć. Dzięki.
Jakiś czas później ...
Po wielu badaniach wymyśliłem dwa działające rozwiązania. Oba działały i tworzyły animację między kartami.
Rozwiązanie 1: przejście z widoku (proste)
Jest to najłatwiejsze i wykorzystuje predefiniowaną metodę przejścia UIView. Dzięki temu rozwiązaniu nie musimy zarządzać widokami, ponieważ metoda działa za nas.
Rozwiązanie 2: przewiń (bardziej złożone)
Bardziej złożone rozwiązanie, ale zapewnia większą kontrolę nad animacją. W tym przykładzie możemy włączyć i wyłączyć widoki. W tym przypadku musimy sami zarządzać widokami.
To rozwiązanie w Swift:
źródło
shouldSelectViewController
i wróć NIE tamponiżej jest moja próba użycia kodu postaci drekka w metodzie delegata (UITabBarControllerDelegate)
źródło
Moje rozwiązanie dla iOS7.0 lub nowszego.
Możesz określić niestandardowy kontroler animacji w delegacie paska kart.
Zaimplementuj taki kontroler animacji:
Następnie użyj go w swoim UITabBarControllerDelegate:
źródło
Zamiast używać
tabBarController:shouldSelectViewController:
lepiej jest wdrożyćtabBarController:animationControllerForTransitionFromViewController:toViewController:
TransitioningObject.swift
TabBarViewController.swift
źródło
Myślę, że możesz łatwo osiągnąć przejścia dla UITabBarControlelr za pomocą CATransition; To również rozwiąże wszelkie skutki uboczne używania moveFromView: toView:
Użyj tego wewnątrz swojej niestandardowej klasy TabBarController rozszerzonej z UITabBarController.
Mam nadzieję że to pomoże :)
źródło
Napisałem post po wypróbowaniu różnych odpowiedzi tutaj.
Kod jest w języku Swift i możesz programowo zmienić kartę z animacją, wywołując
animateToTab
.Jeśli chcesz, aby wszystkie zmiany kart miały animację, podłącz ją
UITabBarControllerDelegate
tak, aby polubiła:źródło
Moje rozwiązanie w Swift:
Utwórz niestandardową klasę TabBar i ustaw ją w swoim Storyboard TabBar
źródło
finished
będzie fałszywy). Nie wiem, dlaczego tak się dzieje, ale myślę, że ma to związek z transformacją CA, która uważa, że nie ma „nic do animacji”. Przerzuciłem się na animację z ramkami i to zadziałało.Użyłem rozwiązania @ Mofumofu i zaktualizowałem je do Swift 1.2, a także zaimplementowałem animację w górę / w dół. Oznacza to, że pojawia się nowy kontroler ViewController i wypycha stary w górę, jeśli indeks nowego kontrolera widoku jest większy niż stary. W przeciwnym razie kierunek jest w dół.
W kontrolerze widoku kontenera:
źródło
Oto moje rozwiązanie Swift 3:
Nadpisuję selectedIndex mojego UITabBarViewController w ten sposób:
Następnie używam tej funkcji, która naśladuje natywną animację push / pop:
Mam nadzieję, że to pomoże :)
źródło
poprawka dla skocznej animacji ...
UIView * fromView = self.view.superview;
źródło
można to rozwiązać na dwa sposoby
1 - Napisz to raz w swoim pliku AppDelegate.m. Pamiętaj, aby dołączyć UITabBarControllerDelegate, używając <> po dwukropku (:) w swoim AppDelegate.h
2 - Napisz to w każdym pliku ViewController.m
Mam nadzieję, że to pomoże...!
źródło
Możesz animować w zależności od stukniętego elementu - w tym przykładzie flipFromLeft jest przewijany w stosunku do poprzedniego wybranego indeksu i przewracaFromRight, jeśli wybrany indeks jest <niż poprzednio wybrany indeks. To jest Swift 4: Zaimplementuj metodę UITabBarControllerDelegate
źródło
Odpowiedź Drekki jest naprawdę świetna. Poprawiłem trochę przejście przewijania, aby animacja wyglądała bardziej jak animacja wypychania Apple. Dodałem dodatkową animację po zakończeniu pierwszej animacji, aby efekt przesuwania wyglądał dobrze.
źródło
Chciałem użyć przejścia typu flip między dwoma kontrolerami widoku podrzędnego po naciśnięciu przycisku i osiągnąłem to w następujący sposób:
Ustawiłem również kolor tła na czarny, w moim przypadku zrobiłem to przez ustawienie navigationController.view.backgroundColor, ale w twoim przypadku może to być window.backgroundColor, który można łatwo ustawić w delegacie aplikacji.
źródło
Oto mój działający kod ( dla 3 kart , nie próbowałem go na więcej !!) do animacji przejść między kartami. Jest oparty głównie na rozwiązaniu drekki, ale już zaimplementowany w metodzie delegata tabbara, więc powinien załatwić sprawę, jeśli po prostu go skopiujesz / wkleisz ... (nigdy nie wiadomo!)
}
źródło
To działa dla mnie w Swift 3:
źródło
@samwize Odpowiedź przetłumaczona na Swift 3 - 2 kciuki w górę na tym, tworzy efekt strony od lewej do prawej:
źródło
Odpowiedź @ samwize zaktualizowana dla Swift 5:
Jeśli chcesz, aby wszystkie zmiany na karcie miały animację, użyj UITabBarControllerDelegate i zaimplementuj tę metodę:
Programowo zmień kartę z animacją, wywołując
animateToTab
:źródło
Swift 4+
Twoja
UITabBarControllerDelegate
metoda powinna być taka,A metoda jest taka,
źródło