je développe un jeu qui contenait une vue (comme un jeu de cartes à mémoire) et que je veux que lorsque l'utilisateur tape sur une carte, cette bascule montre une autre vue. J'utilise ce code:
- (void)flipCard:(id)sender {
UIButton *btn=(UIButton *)sender;
UIView *view=[btn superview];
UIView *flipView=[[UIView alloc] initWithFrame:[view frame]];
[flipView setBackgroundColor:[UIColor blueColor]];
[[flipView layer] setCornerRadius:10];
NSLog(@"Flip card : view frame = %f, %f",view.frame.Origin.x, view.frame.Origin.y);
[UIView transitionFromView:view toView:flipView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
}];
}
Chaque vue possède un bouton transparent qui couvre la totalité de la vue. Ainsi, lorsque l'utilisateur appuie sur une vue, il clique sur le bouton. Le bouton appelle la méthode ci-dessus en transmettant l'expéditeur . Lorsque l'animation commence, toutes les vues sont retournées, pas seulement la vue que je reçois de l'expéditeur .
Le code suivant pourrait vous aider avec votre problème. Je pense que c'est plus propre que d'utiliser un bouton transparent.
- (void)viewDidLoad {
[super viewDidLoad];
flipped = NO;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[flipContainerView addGestureRecognizer:tapGesture];
[tapGesture release];
}
- (void)handleTap:(UITapGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
[UIView transitionWithView:flipContainerView
duration:1
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{
if (!flipped) {
[frontCard setHidden:YES];
[flipContainerView addSubview:backCard.view]; //or unhide it.
flipped = YES;
} else {
[frontCard setHidden:NO];
[backCard removeFromSuperview]; //or hide it.
}
} completion:nil];
}
}
J'ai eu le même problème. Après avoir cherché différents articles sur Internet, j'ai pu trouver une solution élégante et simple. J'ai les cartes en tant que boutons UIB personnalisés. Dans la classe UIButton personnalisée, j'ai ajouté la méthode qui modifie l'image d'arrière-plan avec une animation inversée:
-(void) flipCard{
[UIView transitionWithView:self
duration:0.3f
options:UIViewAnimationOptionTransitionFlipFromRight|UIViewAnimationOptionCurveEaseInOut
animations:^{
if (self.isFlipped) {
[self setBackgroundImage:[UIImage imageNamed:@"card_back_2.png"] forState:UIControlStateNormal];
}else{
[self setBackgroundImage:[UIImage imageNamed:self.cardName] forState:UIControlStateNormal];
}
} completion:NULL];
self.isFlipped = !self.isFlipped;
}
J'espère que cela aidera quelqu'un d'autre car la première réponse a déjà été acceptée
METTRE À JOUR
Si vous êtes sur la vue contenant cette sous-vue, le code est le suivant:
-(void)flipCard:(APCard*)card{
[UIView transitionWithView:card
duration:kFlipTime
options:UIViewAnimationOptionTransitionFlipFromRight|UIViewAnimationOptionCurveEaseInOut
animations:^{
if (card.isFlipped) {
[card setBackgroundImage:[UIImage imageNamed:@"card_back_2.png"] forState:UIControlStateNormal];
}else{
[card setBackgroundImage:[UIImage imageNamed:card.cardName] forState:UIControlStateNormal];
}
completion:^(BOOL finished) {
if (finished) {
//DO Stuff
}
}
];
card.isFlipped = !card.isFlipped;
}
Mon cas d'utilisation dans Swift 4:
@IBAction func flipCard() {
let transitionOptions: UIView.AnimationOptions = [.transitionFlipFromRight, .showHideTransitionViews]
UIView.transition(with: letterView, duration: 1.0, options: transitionOptions, animations: {
if self.showingBack == true {
self.letterImage.image = UIImage.init(named: self.letterImageName + ".png")
self.letterNameLabel.text = self.regularWord
self.showingBack = false
} else {
self.letterImage.image = UIImage.init(named: self.letterImageName + "C.png")
self.letterNameLabel.text = self.cursiveWord
self.showingBack = true
}
})
}