55 votes

Animation personnalisée pour pousser un UIViewController

Je veux montrer une animation personnalisée lorsque l'on pousse un view controller: j'aimerais réaliser quelque chose comme un "étendre" de l'animation, cela signifie que le nouveau point de vue s'étend à partir d'un rectangle donné, permet de dire [100,100 220,380] au cours de l'animation en plein écran.

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


Alright. J'ai pu 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];

De mon point de Vue s'affiche correctement, mais malheureusement la barre de navigation n'est pas updatet. Est-il un moyen de le faire manuellement?

heinrich


Dans l'exemple de code, une fonction est appelée de tous 0.03 secondes que les mises à jour de la transformation de la vue. Malheureusement, lorsque l'on pousse un UIViewController, je ne suis pas en mesure de redimensionner le cadre de la vue ... suis-je ?

53voto

zoul Points 51637

J'utilise la fonction suivante (ajouté UINavigationController) pour personnaliser la poussée de l'animation:

- (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 pense que l'on peut adapter ce code pour faire ce que l'animation que vous voulez.

34voto

fyasar Points 2761

Le code que vous cherchez:

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

25voto

imnk Points 2576

Ce que vous pourriez faire est d'appuyer sur le côté-vue-contrôleur, mais ne pas l'animer, comme suit:

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

...et puis, du point de vue du contrôleur qui est enfoncé, vous pourriez faire une animation personnalisée de la vue à l'aide de CoreAnimation. Cela pourrait être mieux fait dans l' viewDidAppear:(BOOL)animated méthode.

Découvrez le Cœur de l'Animation du Guide sur la façon de réellement faire de l'animation. Look particulier à l'implicite de l'animation.

EDIT: lien mis à jour

10voto

Adam Points 194

Heinrich,

J'ai fait une youtube tutoriel qui montre comment faire des points de vue d'élargir et rétrécir, comme dans le facebook app iPhone.

J'espère que ça peut aider: Comment faire élargissement/rétrécissement de points de vue sur le SDK de l'iPhone

Adam

7voto

David Points 56

@zoul: Qui a très bien fonctionné! J'ai juste changé de "auto" à "l'auto.navigationController" et "l'auto.vue" à "l'auto.navigationController.afficher" je Ne sais pas si c'était nécessaire, mais il a travaillé. Et @crafterm, comme pour sauter en arrière, il suffit de faire votre propre leftBarButtonItem en ajoutant ce code dans le 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 fait de ce popWithTransition fonction que j'ai appelé dans mon backButtonTapped méthode.

- (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 le popViewController appel reçu vers le bas à la fin, après l'animation. Ne sais pas si c'est casher, mais encore une fois, cela a fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X