53

Chcę pokazać niestandardową animację podczas przesuwania kontrolera widoku: Chciałbym osiągnąć coś w rodzaju animacji "expand", co oznacza, że ​​nowy widok rozszerza się z danego prostokąta, powiedzmy [100, 100 220,380] podczas animacji na pełny ekran.Niestandardowa animacja do przesuwania UIViewController

Wszelkie sugestie od czego zacząć, a także wszelkie dokumenty, samouczki, linki? :)


W porządku. Mogłem zrobić poszerzyć animację z następującego kodu:

if ([coming.view superview] == nil) 
    [self.view addSubview:coming.view]; 
    coming.view.frame = CGRectMake(160,160,0,0); 
    [UIView beginAnimations:@"frame" context:nil]; 
    [UIView setAnimationDuration:4]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [coming viewWillAppear:YES]; 
    [going viewWillAppear:YES]; 
    coming.view.frame = CGRectMake(0, 0, 320, 480); 
    [going viewDidDisappear:YES]; 
    [coming viewDidAppear:YES]; 
    [UIView commitAnimations]; 

moim zdaniem jest wyświetlany prawidłowo, ale niestety pasek nawigacyjny nie jest aktualizowana. Czy istnieje sposób, aby to zrobić ręcznie?


W przykładowym kodzie wywoływana jest funkcja o wartości 0,03 s, która aktualizuje przekształcenie widoku. Niestety, po naciśnięciu przycisku UIViewController nie mogę zmienić rozmiaru ramki widoku ... czy ja?

Odpowiedz

25

Co można zrobić, to nacisnąć kolejny kontroler widoku, ale nie animować je, tak jak poniżej:

[self.navigationController pushViewController:nextController animated:NO]; 

... a potem, w kontroler widoku, który jest wciśnięty w, można zrobić niestandardowa animacja widoku za pomocą CoreAnimation. Najlepiej zrobić to w metodzie viewDidAppear:(BOOL)animated.

Zapoznaj się z Core Animation Guide, jak faktycznie wykonać animację. Zwróć szczególną uwagę na niejawną animację.

EDIT:updated link

+3

Próbowałem tego podejścia, ale problem polega na tym, że po użyciu tego przycisku pierwszy kontroler widoku znika, zanim następny kontroler zacznie animować. Co powinno się stać: 1) następny kontroler widoku animuje się, a jego widok całkowicie pokrywa widok starego vc, a następnie wyskakuje stary vc. Kompiluję system iOS 4.3, a to nie działa. – SpaceDog

+1

To także nie jest skalowalne. Kontroler nawigacyjny powinien obsługiwać animację. To jest hack, który musiałbyś zaimplementować dla każdego pchanego kontrolera widoku. –

3

Co chcesz, to pliki do pobrania dla rozdziału 2 z iphone developers cookbook. Spójrz na próbkę affineRotate, chociaż pomoże Ci jedna z podstawowych próbek animatyny.

+0

Dzięki. Będę na to lokować. – Erik

52

używam następujących funkcji (dodawane do UINavigationController), aby dostosować animację przycisku:

- (void) pushController: (UIViewController*) controller 
     withTransition: (UIViewAnimationTransition) transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [self pushViewController:controller animated:NO]; 
    [UIView setAnimationDuration:.5]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.view cache:YES]; 
    [UIView commitAnimations]; 
} 

Chyba można dostosować ten kod, aby zrobić cokolwiek animacja chcesz.

+2

Niezły, jak sobie radzisz z obudową popViewController? z tego, co widzę, puknięcie przycisku wstecz nie wywołuje żadnej pary target/selektora, nawet jeśli przeciąłeś przycisk wstecz i dostarczysz go, więc nie możesz ustawić go tak, by wskazywał niestandardową metodę pop, która zawiera animację? – crafterm

+0

Pamiętam, jak przez jakiś czas walczyłem z niestandardowymi animacjami, a następnie szukałem mniej bolesnego rozwiązania. Nie pamiętam, z czego skorzystałem, ale prawdopodobnie było to coś podobnego do zaakceptowanej odpowiedzi (lub po prostu zrezygnowałem i zastosowałem przejście do fabryki). – zoul

+1

gdzie powinienem napisać ten kod? – ichanduu

7

@zoul: To działało świetnie! Właśnie zmieniłem "self" na "self.navigationController" i "self.view" na "self.navigationController.view" Nie wiem, czy to było konieczne, ale zadziałało. I @crafterm, jak popping z powrotem, po prostu zrobić własny leftBarButtonItem dodając ten kod w viewDidLoad lub ViewWillAppear:

//add your own left bar button 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)]; 
self.navigationItem.leftBarButtonItem = backButton; 
[backButton release]; 

Wtedy właśnie manipulowane funkcję Push i uczynił tę funkcję popWithTransition że nazwałem moim -backButtonTapped metody .

- (void) popWithTransition: (UIViewAnimationTransition) transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:.75]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES]; 
    [UIView commitAnimations]; 
[self.navigationController popViewControllerAnimated:NO]; 
} 

Należy zauważyć, że wywołanie popViewController zostało przesunięte do końca po animacji. Nie wiem, czy to koszer, ale znowu zadziałało.

10

Heinrich,

Zrobiłem tutorial youtube pokazujący jak zrobić widoki poszerzyć i kurczyć, jak w aplikacji facebook iPhone.

Nadzieję, że może być pomocne: How to make expanding/shrinking views on iPhone SDK

Adam

+0

dobry jeden bardzo pomocne ja – harshalb

+0

@Adam, więc uczę się od samouczka dla aplikacji na iPada. zauważyłem, że środek animacji w trybie poziomym jest nieprawidłowy. co należy zrobić, aby animacja wyglądała poprawnie w trybie poziomym? muszę powiedzieć animacji, gdzie powinny być początkowe granice. – topwik

34

Kod których szukasz:

[UIView beginAnimations:@"View Flip" context:nil]; 
[UIView setAnimationDuration:0.80]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

[UIView setAnimationTransition: 
UIViewAnimationTransitionFlipFromRight 
         forView:self.navigationController.view cache:NO]; 


[self.navigationController pushViewController:menu animated:YES]; 
[UIView commitAnimations]; 
+0

Jak radzić sobie z scenariuszem popViewController? – Ans

3

Wystarczy popatrzeć na ADTransitionController, spadek zamiennikiem UINavigationController ze zwyczajem Animacje przejścia (jego API pasuje do API UINavigationController), które stworzyliśmy w Applidium.

Można użyć różnych predefiniowanych animacji dla naciśnięciem i pop działań takich jak Swipe, Fade, Cube, Carrousel i tak dalej. W Twoim przypadku żądana animacja to ta o nazwie Zoom.

Powiązane problemy