Comment retourner une UIView autour de l'axe x, tandis que simultanément la commutation des sous-vues

Cette question a été posée avant, mais de manière un peu différente et je n'ai pas pu obtenir toutes les réponses à travailler comme je le voulais, donc j'espère que quelqu'un avec un grand Cœur de l'Animation de compétences peut m'aider.

J'ai un jeu de cartes sur une table. En tant que l'utilisateur glisse le doigt vers le haut ou vers le bas l'ensemble des cartes de déplacer vers le haut et vers le bas de la table. Il y a 4 cartes visibles sur l'écran à un moment donné, mais seulement la deuxième carte montre son visage. En tant que l'utilisateur effectue la deuxième carte bascule en arrière sur son visage et la prochaine carte (selon le sens de balayage) des terres en place en montrant son visage.

J'ai mis en place ma carte de vue de la classe comme ceci:

@interface WLCard : UIView {
    UIView *_frontView;
    UIView *_backView;
    BOOL flipped;
}

Et j'ai essayé de retourner la carte à l'aide de ce morceau de code:

- (void) flipCard {
    [self.flipTimer invalidate];
    if (flipped){
        return;
    }

    id animationsBlock = ^{
            self.backView.alpha = 1.0f;
            self.frontView.alpha = 0.0f;
            [self bringSubviewToFront:self.frontView];
            flipped = YES;

            CALayer *layer = self.layer;
            CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
            rotationAndPerspectiveTransform.m34 = 1.0 / 500;
            rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, M_PI, 1.0f, 0.0f, 0.0f);
            layer.transform = rotationAndPerspectiveTransform;
    };
    [UIView animateWithDuration:0.25
                          delay:0.0
                        options: UIViewAnimationCurveEaseInOut
                     animations:animationsBlock
                     completion:nil];

}

Ce code fonctionne, mais il a d'autres problèmes que je n'arrive pas à comprendre:

  1. Seulement la moitié de la carte au niveau de l'axe des x est animé.
  2. Une fois retournée, la face de la carte est à l'envers et en miroir.
  3. Une fois que j'ai retourné la carte je ne peux pas obtenir de l'animation à jamais couru de nouveau. En d'autres termes, je peux exécuter le bloc d'animation autant de fois que je veux, mais seulement la première fois à animer. Les fois suivantes j'essaie d'animer simplement mener à un fondu entrant et sortant entre les sous-vues.

Aussi, gardez à l'esprit que j'ai besoin d'être capable d'interagir avec la surface de la carte. c'est à dire qu'il a des boutons sur elle.

Si quelqu'un a été confronté à ces questions, il serait bien de voir vos solutions. Encore mieux serait d'ajouter une perspective de transformation de l'animation pour donner un peu plus de réalisme.

OriginalL'auteur Michael Gaylord | 2012-03-11