2012-06-23 11 views
5

W niestandardowym segue, mam następujący prosty przejścia:niestandardowe animacje dla UINavigationController Nie pchać renderowania NavBar poprawnie

- (void) perform { 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 
    [UIView transitionWithView:src.navigationController.view duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        animations:^{ 
         [src.navigationController pushViewController:dst animated:NO]; 
        } 
        completion:NULL]; 
} 

Zawartość widok ożywia porządku. Jednak podczas wykonywania animacji pasek nawigacji u góry ma popsuty układ (przyciski wszystkie zapchane w lewym górnym rogu, bez tytułu), pojawiający się na miejscu dopiero po zakończeniu animacji. Czy ktoś wie, co zrobiłem źle i jak to naprawić? Dzięki!

Odpowiedz

5

Wyobraziłem sobie mój problem. Oryginalny kod jest rzeczywiście nieprawidłowy, biorąc pod uwagę sposób działania kontrolera UINavigationController i współdziałając z kontrolkami UIViewControl, którymi zarządza. (Nieznośno rzeczy, jak to, co zrobiłem w PO można znaleźć w postaci roztworu w starszych SO stanowisk).

Oto kod, który pracuje dla mnie (z jednym drobne zastrzeżenie):

- (void) perform { 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 
    [UIView transitionFromView:src.view 
         toView:dst.view 
         duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        completion:nil]; 
    [UIView transitionFromView:src.navigationItem.titleView 
         toView:dst.navigationItem.titleView 
         duration:1 
         options:UIViewAnimationOptionTransitionFlipFromBottom 
        completion:nil]; 
    [src.navigationController pushViewController:dst animated:NO]; 
} 

zastrzeżenie: to będzie animuj pasek nawigacyjny niezależnie od widoku zawartości, dzięki czemu masz dwa elementy przewracające się zamiast całego ekranu. Miałem pierwotnie próbował zrobić:

[UIView transitionFromView:src.navigationController.view 
         toView:dst.navigationController.view 

Ale to nie działa, ponieważ nieruchomość navigationController W 1) Cel nie jest nawet jeszcze ustawiony dopóki nie zostanie wciśnięty na kontrolerze nav, i 2), nawet gdyby było, że będę nawiązując do tego samego widoku! Zapomniałem, że

Widok na kontrolerze nawigacji jest tylko kontenerem dla kilku innych poglądów, w tym pasku nawigacyjnym, opcjonalny pasek narzędzi, a widok zawierającej treści niestandardowy ... Chociaż treść pasek nawigacji i widoki widoku paska narzędzi zmieniają się, widoki same w sobie robią nie ... obiekt kontrolera nawigacji dynamicznie buduje zawartość paska nawigacyjnego dynamicznie za pomocą elementów nawigacyjnych (wystąpienia klasyklasy UINavigationItem) skojarzonych z kontrolkami widoku na stos nawigacyjny. Aby zmienić zawartość paska nawigacji, należy zatem skonfigurować elementy nawigacji dla niestandardowych kontrolerów widoku . (docs)

+0

Czy ktoś może wyjaśnić, dlaczego została wycofana? – qix

+0

Wielkie dzięki! Twój snipowany kod pomógł mi dowiedzieć się, jak mogę animować tylko przełączanie paska nawigacyjnego podczas push, ale nie przełączanie widoku zawartości – Denis

0

Kolejny "spór"? kładę

[src.navigationController pushViewController:dst animated:YES]; 

przed

[UIView transitionFromView ... 

tak, że kontroler nawigacyjny był osiągalny w ciągu metody viewDidLoad docelowego nie ma.

Powiązane problemy