Niestandardowa Animacja do pchania kontrolera UIViewController

Chcę pokazać animację niestandardową podczas przesuwania kontrolera widoku: chciałbym osiągnąć coś w rodzaju animacji "rozwiń", co oznacza, że nowy widok rozszerza się z danego prostokąta, powiedzmy [100,100 220,380] podczas animacji na Pełny ekran.

Jakieś sugestie od czego zacząć, jakieś dokumenty, tutoriale, linki? :)


W porządku. Mogę zrobić animację rozwiń za pomocą 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];

Mój widok jest prawidłowo wyświetlany, ale niestety pasek nawigacji nie jest aktualizowany. Można to zrobić ręcznie?


W kodzie przykładowym funkcję nazywa się all 0.03 seconds, która aktualizuje transformację widoku. Niestety, naciskając UIViewController, nie jestem w stanie zmienić rozmiaru ramki widoku ... naprawdę ?

Author: NightFury, 2009-09-10

7 answers

Możesz wcisnąć następny kontroler widoku, ale nie Animuj go w ten sposób:

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

...następnie, w kontrolerze widoku, który jest wciskany, możesz wykonać niestandardową animację widoku za pomocą CoreAnimation. Najlepiej zrobić to metodą viewDidAppear:(BOOL)animated.

Zapoznaj się z przewodnikiem Core Animation Guide o tym, jak właściwie wykonać animację. Spójrz szczególnie na ukrytą animację.

Edytuj: zaktualizowany link

 25
Author: imnk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-17 20:04:27

Używam następującej funkcji (dodanej do UINavigationController), aby dostosować animację push:

- (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];
}

Myślę, że możesz dostosować ten kod do tworzenia dowolnej animacji.

 52
Author: zoul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-15 08:13:13

Kod, którego 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];
 34
Author: fyasar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-31 08:02:11

Heinrich,

Zrobiłem tutorial youtube pokazujący, jak zwiększyć i zmniejszyć widoki, jak w aplikacji facebook iPhone.

Mam nadzieję, że może to pomóc: Jak zrobić rozszerzające / zmniejszające się widoki na iPhone SDK

Adam

 10
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-16 13:49:14

@zoul: to zadziałało świetnie! Właśnie zmieniłem "ja" na "ja".navigationController " i " self.zobacz " do " siebie.navigationController.Widok " Nie wiem, czy to było konieczne, ale zadziałało. A @crafterm, co do popping back, po prostu zrób sobie 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];

Potem po prostu podkręciłem funkcję push i zrobiłem tę funkcję popWithTransition, którą wywołałem w metodzie-backButtonTapped.

- (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];
}

Zauważ, że wywołanie popViewController zostało przesunięte w dół do końca, po animacji. Nie wiem, czy to koszerne, ale znowu zadziałało.

 7
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-19 11:59:55

To, co chcesz, to pliki do pobrania dla rozdziału 2 iphone developers cookbook . Przyjrzyj się dokładnie próbce afinerotatu, chociaż każda z podstawowych próbek animatin ci pomoże.

 3
Author: ennuikiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-10 15:54:47

Spójrz na ADTransitionController , spadek zastąpienia UINavigationController niestandardowymi animacjami przejścia (jego API pasuje do API UINavigationController), które stworzyliśmy w Applidium.

Możesz używać różnych predefiniowanych animacji dla push i pop akcji, takich jak Swipe, Fade, Cube, Karuzela i tak dalej. W Twoim przypadku animacja, o którą prosisz, to ta o nazwie Zoom .

 3
Author: felginep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-17 13:58:58