Ceci est un projet iPad pour lequel j'ai un UIView avec plusieurs sous-vues et j'essaye d'animer une de ces vues UIViews en utilisant [UIView transitionFromView: toView: durée: options: complétion], mais lorsque j'exécute cette méthode, la vue parent entière est retourné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 parent entière? Merci!
ce code peut vous aider:
placez les deux vues que vous souhaitez retourner dans une vue non nommée de même taille et liez le IBOutlet UIView *newView,*oldView;
aux vues et placez la nouvelle vue au premier plan.
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 "retournement", le prochain retournement a commencé à devenir bizarre, là où les boutons et les étiquettes de l'interface utilisateur avant ont perdu leurs positions.
J'ai mis le code ci-dessous en place et cela 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é jusqu’aux deux boutons 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 la vue conteneur ait la même taille que la 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 résolu 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 firstView:
[firstView removeFromSuperview];
Je voudrais faire une mise à jour de la réponse de Steve Parker dans Swift 4: -
var displayBlankView:Bool = true
UIView.transition(with:flipView, duration:1.0, options:displayBlankView ? .transitionFlipFromLeft:.transitionFlipFromRight, animations:{
if(self.displayBlankView){
self.view1.isHidden=true
self.view2.isHidden=false
}else{
self.view1.isHidden=false
self.view2.isHidden=true
}
}, completion:{
(finished: Bool) in
self.displayBlankView = !self.displayBlankView;
})