ich entwickle ein Spiel, das einige Ansichten enthielt (als Speicherkartenspiel), und ich möchte, dass, wenn der Benutzer auf eine Karte tippt, dieser Flip eine andere Ansicht zeigt. Ich benutze diesen 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) {
}];
}
Jede Ansicht hat eine transparente Schaltfläche, die die gesamte Ansicht abdeckt. Wenn Sie also auf eine Ansicht tippen, tippen Sie auf die Schaltfläche. Die Schaltfläche ruft die Methode oben auf, die den Absender übergibt. Wenn die Animation gestartet wird, wird die gesamte Ansicht umgedreht, nicht nur die Ansicht, die ich vom Absender bekomme.
Der folgende Code kann bei Ihrem Problem helfen. Ich denke, es ist sauberer als eine transparente Taste.
- (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];
}
}
Ich hatte das gleiche Problem. Nachdem ich verschiedene Beiträge im Internet gesucht hatte, konnte ich eine elegante und einfache Lösung finden. Ich habe die Karten als benutzerdefinierte UIButtons. In der benutzerdefinierten UIButton-Klasse habe ich die Methode hinzugefügt, die das Hintergrundbild durch eine Flip-Animation ändert:
-(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;
}
Hoffe, das hilft jemand anderem, da die erste Antwort bereits akzeptiert wurde
UPDATE
Wenn Sie sich in der Ansicht befinden, die diese Unteransicht enthält, lautet der Code:
-(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;
}
Mein Anwendungsfall in 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
}
})
}