C'est un projet iPad où j'ai un UIView avec plusieurs sous-vues, et j'essaye d'animer un de ces UIViews en utilisant [UIView transitionFromView: toView: duration: options: completion], mais quand j'exécute cette méthode, la vue parent entière est inversée ! C'est le code que j'utilise:
UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)]; [newView setBackgroundColor:[UIColor redColor]]; [UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
Toute idée sur comment puis-je basculer entre ces vues sans animer la vue entière des parents? Merci!
ce code peut vous aider:
placez les deux vues que vous voulez returnner à l'intérieur d'une vue sans nom avec la même taille et liez l' IBOutlet UIView *newView,*oldView;
aux vues et mettre la nouvelle vue sur le dessus
bool a = NO; @implementation ViewController - (IBAction)flip:(id)sender { if (a == NO) { [UIView transitionFromView:oldView toView:newView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; a = YES; // a = !a; } else { [UIView transitionFromView:newView toView:oldView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; a = NO; // a = !a; } }
J'ai eu des problèmes pour que cela fonctionne aussi. J'ai utilisé le code écrit par Floris, mais bien que cela ait fonctionné pour le premier "flip", le prochain flip a commencé à devenir bizarre, là où les buttons et les labels de la face avant ont perdu des positions.
J'ai mis le code ci-dessous en place et ça fonctionne bien.
Quelques choses à noter:
(dans mon .h)
@property BOOL displayingFront;
dans mon .m
@synthesize displayingFront;
dans ma méthode viewDidLoad
self.displayingFront = YES;
C'est le code dans le .m que j'ai truqué aux deux buttons si UIViews avant et arrière …
- (IBAction)flip:(id)sender { [UIView transitionWithView:self.panelView duration:1.0 options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{ if(displayingFront) { self.frontView.hidden = true; self.backView.hidden = false; } else { self.frontView.hidden = false; self.backView.hidden = true; } } completion:^(BOOL finished) { if (finished) { displayingFront = !displayingFront; } }]; }
Utilisez une vue conteneur pour conserver vos sous-vues et faites en sorte que l'affichage du conteneur soit de la même taille que votre sous-vue que vous essayez d'animer.
Ainsi, vous pouvez configurer vos vues comme ceci.
self.view-> "une vue conteneur" -> sous-vues
**//flipping view continuously** bool a = NO; -(void)viewDidLoad { // THIS is the canvass holding the two views this view is flipping UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)]; v.backgroundColor=[UIColor clearColor]; [self.view addSubview:v]; [v addSubview:yourfirstview]; [v addSubview:yoursecondview]; // calling the method [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(flip) userInfo:nil repeats:YES]; } //flipping view randomly -(void)flip { if (a == NO) { [UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; a = YES; } else if(a==YES) { [UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; a = NO; } }
J'ai corrigé ce problème en utilisant des animations old-school:
[UIView beginAnimations:@"Flip" context:nil]; [UIView setAnimationDuration:1]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES]; [self addSubview:secondView]; [UIView commitAnimations];
De plus, vous pouvez supprimer le premier aperçu:
[firstView removeFromSuperview];