webentwicklung-frage-antwort-db.com.de

iOS - Flip-Animation nur für bestimmte Ansicht

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.

27

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];
    }
}
46
carlos

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;
}
13
Sanandrea

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
            }
        })
    }
0
David DelMonte