web-dev-qa-db-fra.com

Animation personnalisée pour pousser un UIViewController

Je veux montrer une animation personnalisée lorsque je pousse un contrôleur de vue: je voudrais réaliser quelque chose comme une animation "expand", ce qui signifie que la nouvelle vue se développe à partir d'un rectangle donné, disons [100,100 220,380] pendant l'animation en plein écran.

Des suggestions par où commencer, respectivement des documents, des tutoriels, des liens? :)


Bien. Je pourrais faire l'animation de développement avec le code suivant:

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

Ma vue s'affiche correctement, mais malheureusement, la barre de navigation n'est pas mise à jour. Existe-t-il un moyen de le faire manuellement?


Dans l'exemple de code, une fonction est appelée toutes les 0,03 secondes qui met à jour la transformation de la vue. Malheureusement, lorsque je pousse un UIViewController, je ne parviens pas à redimensionner le cadre de la vue ... le suis-je?

55
Erik

Ce que vous pourriez faire, c'est pousser le prochain contrôleur de vue mais ne l’animez pas, comme ceci:

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

... puis, dans le contrôleur de vue qui est inséré, vous pouvez faire une animation personnalisée de sa vue à l'aide de CoreAnimation. Cela peut être mieux fait dans la méthode viewDidAppear:(BOOL)animated.

Consultez le Core Animation Guide sur la façon de faire réellement l'animation. Regardez particulièrement l'animation implicite.

MODIFIER: lien mis à jour

25
imnk

J'utilise la fonction suivante (ajoutée à UINavigationController) pour personnaliser l'animation 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];
}

Je suppose que vous pourriez adapter ce code pour faire l'animation que vous voulez.

53
zoul

Le code que vous recherchez:

    [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
fyasar

Heinrich,

J'ai créé un didacticiel sur YouTube montrant comment agrandir et réduire les vues, comme dans l'application iPhone Facebook.

J'espère que cela peut être utile: Comment faire pour agrandir/réduire les vues sur le SDK iPhone

Adam

10
Adam

@zoul: Cela a très bien fonctionné! Je viens de changer "self" en "self.navigationController" et "self.view" en "self.navigationController.view" Je ne sais pas si c'était nécessaire, mais cela a fonctionné. Et @crafterm, comme pour le retour, créez votre propre leftBarButtonItem en ajoutant ce code dans viewDidLoad ou 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];

Ensuite, j'ai juste modifié la fonction Push et créé cette fonction popWithTransition que j'ai appelée dans ma méthode -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];
}

Notez que l'appel popViewController a été déplacé vers la fin, après l'animation. Je ne sais pas si c'est casher, mais encore une fois, cela a fonctionné.

7
David

Jetez un oeil à ADTransitionController , une baisse en remplacement de UINavigationController avec des animations de transition personnalisées (son API correspond à l'API de UINavigationController) que nous avons créé chez Applidium.

Vous pouvez utiliser différentes animations prédéfinies pour les actions Push et pop telles que as Swipe, Fade, Cube, Carrousel et ainsi de suite. Dans votre cas, l'animation que vous demandez est celle appelée Zoom.

3
felginep

Ce que vous voulez, ce sont les téléchargements pour le chapitre 2 de livre de cuisine des développeurs iphone . Examinez l'exemple affineRotate en particulier, bien que n'importe lequel des échantillons animatin de base vous aidera.

3
ennuikiller