53

Je veux montrer une animation personnalisée en poussant 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.Animation personnalisée pour pousser un UIViewController

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


D'accord. Je pourrais faire l'animation avec le élargir 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]; 

My View est correctement affiché, mais malheureusement, la barre de navigation est pas mis à jour. Y a-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, en poussant un UIViewController, je ne suis pas en mesure de redimensionner le cadre de la vue ... suis-je?

Répondre

25

Ce que vous pouvez faire est de pousser le contrôleur suivant vue mais ne pas animer, comme ceci:

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

... et puis, dans le contrôleur de vue qui se poussé, vous pouvez faire une animation personnalisée de sa vue en utilisant CoreAnimation. Cela pourrait être mieux fait dans la méthode viewDidAppear:(BOOL)animated.

Consultez le Core Animation Guide pour savoir comment réaliser l'animation. Regardez particulièrement l'animation implicite.

EDIT:updated link

+3

J'ai essayé cette approche mais le problème est que lorsque vous utilisez cette poussée, le premier contrôleur de vue disparaît avant que le contrôleur suivant commence à animer. Ce qui devrait arriver est: 1) le contrôleur de vue suivant s'anime et sa vue couvre complètement la vue de l'ancien vc, puis l'ancien vc apparaît. Je compile pour iOS 4.3 et cela ne fonctionne pas. – SpaceDog

+1

Ce n'est pas évolutif aussi. Un contrôleur de navigation devrait gérer l'animation. C'est un hack que vous auriez à implémenter pour chaque contrôleur de vue poussé. –

3

Ce que vous voulez, c'est les téléchargements pour le chapitre 2 de iphone developers cookbook. Regardez l'échantillon affineRotate spécifiquement, bien que l'un des échantillons d'animatin de base vous aidera.

+0

Merci. Je vais lok à cela. – Erik

52

J'utilise la fonction suivante (ajouté à 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 pouvez adapter ce code pour faire tout l'animation que vous voulez.

+2

Nice, comment gérez-vous le cas popViewController? d'après ce que je peux voir, appuyer sur le bouton Précédent n'appelle pas une paire cible/sélecteur même si vous surchargez le bouton Précédent et en fournir un, vous ne pouvez donc pas le définir pour pointer vers une méthode pop personnalisée qui inclut une animation? – crafterm

+0

Je me souviens d'avoir lutté avec les animations personnalisées pendant un moment, puis d'essayer une solution moins douloureuse. Je ne peux pas me souvenir de ce que j'ai fini par utiliser, mais c'était probablement quelque chose qui s'apparente à la réponse acceptée (ou j'ai simplement abandonné et utilisé une transition d'usine). – zoul

+1

où suis-je censé écrire ce code? – ichanduu

7

@zoul: Ça a bien marché! 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 sauter en arrière, juste faire 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]; 

Alors je viens peaufiné la fonction push et fait cette fonction popWithTransition que j'ai appelé 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écalé vers la fin, après l'animation. Je ne sais pas si c'est kasher, mais encore une fois, cela a fonctionné.

10

Heinrich,

J'ai fait un tutoriel sur youtube montrant comment faire des vues agrandir et réduire, comme dans l'application iPhone facebook.

L'espoir peut être utile: How to make expanding/shrinking views on iPhone SDK

Adam

+0

bon un très utile pour moi – harshalb

+0

@Adam, donc j'ai appris de votre tutoriel pour une application iPad. J'ai remarqué que le centre de l'animation en mode paysage n'est pas correct. que faut-il faire pour que l'animation soit correcte en mode paysage? J'ai besoin de dire à l'animation où les limites de départ devraient être. – topwik

34

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

Comment gérer le scénario popViewController? – Ans

3

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

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