2013-07-01 4 views
4

Cher Core Animation/iOS Experts,UIView Flip animation avec animation de base

J'essaie d'obtenir un effet similaire à la question ci-dessous.

Core animation animating the layer to flip horizontally

La réponse acceptée semble décrire exactement ce que je demande, sauf qu'il n'y a pas de code avec cette réponse et je ne peux pas obtenir un code que j'écris au travail.

Voici exactement ce que je suis en train de faire:
1) Avoir 1 contrôleur vue maître/vue et sur une partie de la vue principale ont 2 UIViews qui se chevauchent, avec un seul montré (1 au « avant 'et 1 à' l'arrière ')
2) Un UIControl/UIButton séparé est enfoncé puis une transition de flip 3D survient qui fait pivoter la vue avant (visible) hors de la vue et fait pivoter en même temps la vue arrière (cachée) vers le front ... juste comme voir le revers d'une carte à jouer.
3) Pouvoir continuer à appuyer sur l'UIControl pour basculer entre les deux vues
4) Être en mesure d'interagir avec les commandes de la vue de face (c.-à-d. Appuyer sur la couche avant ne déclenchera pas involontairement un contrôle sur le dos il se trouve qu'il se trouve sous le robinet)

Je peux être approcher de ce mauvais sens alors faites le moi savoir. Idéalement, je voudrais utiliser Core Animation, et non UIView construit dans les transactions flip, car je veux que l'animation soit en 3D et que vous voulez utiliser cette tâche comme un tremplin pour faire des choses CA plus complexes. Pour le moment je peux obtenir la vue de face pour retourner joliment (une seule fois), mais la vue arrière ne montre pas.

Cheers,
Andy

Voici le code que j'ai:

MainViewController.h

@interface MainViewController : UIViewController 
    - (IBAction)changeViewTapped:(UITapGestureRecognizer *)recognizer; 
@end 

MainViewController.m

#import "MainViewController.h" 
#import <QuartzCore/QuartzCore.h> 

@interface MainViewController() 

@property (weak, nonatomic) IBOutlet UIView *detailView; 
@property (weak, nonatomic) IBOutlet UIView *listView; 
@property (nonatomic) CATransform3D rotationAndPerspectiveTransform; 

@end 

@implementation MainViewController 

@synthesize detailView = _detailView; 
@synthesize listView = _listView; 
@synthesize rotationAndPerspectiveTransform = _rotationAndPerspectiveTransform; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
    rotationAndPerspectiveTransform.m34 = 1.0/-500; 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, M_PI, 0.0f, 1.0f, 0.0f); 
    self.rotationAndPerspectiveTransform = rotationAndPerspectiveTransform; 

    CALayer *listLayer = self.listView.layer; 
    listLayer.doubleSided = NO; 
    listLayer.transform = self.rotationAndPerspectiveTransform; 
} 

- (IBAction)changeViewTapped:(UITapGestureRecognizer *)recognizer { 
    CALayer *detailLayer = self.detailView.layer; 
    CALayer *listLayer = self.listView.layer; 

    detailLayer.doubleSided = NO; 
    listLayer.doubleSided = NO; 

    [UIView animateWithDuration:0.5 animations:^{ 
     detailLayer.transform = self.rotationAndPerspectiveTransform; 
     listLayer.transform = self.rotationAndPerspectiveTransform; 
    } completion:^(BOOL finished){ 
     // code to be executed when flip is completed 
    }]; 
} 

@end 

Répondre

3

Un petit conseil sur l'animation de flip dans iOS - le système a besoin de temps pour rendre la vue arrière (celle qui sera retournée) avant de lancer l'animation de flip. Donc, si vous essayez de changer le contenu de cette vue, et déclenchez l'animation flip dans la même méthode, vous aurez des problèmes.

Pour contourner ce problème, j'ai eu du succès avec le code comme ceci:

- (void)flipView { 
    // Setup the view for the back side of the flip 

    [self performSelector:@selector(performFlip) withObject:nil afterDelay: 0.1]; 
} 

- (void)performFlip { 
    [UIView transitionWithView: tileToFlip 
         duration: 0.5 
         options: UIViewAnimationOptionTransitionFlipFromLeft 
        animations:^{ 
         // My flip specific code 
        } 
        completion:^(BOOL finished) { 
        } 
    ]; 
} 

En un mot, je mise tout dans la méthode flipView, rendre le contrôle à iOS il a le temps de faites le rendu, puis démarrez le sélecteur flipTile au bout d'un dixième de seconde pour réaliser l'animation.

Bonne chance!

+2

Si pas être '[auto performSelector @selector (performFlip) withObject: néant afterDelay: 0,1];' l'aide performFlip pas flipTile? – DelightedD0D

+1

Bonne prise. Fixé. – Axeva

+0

Merci, ça marche pour moi. –

0
- (void)perform 
{ 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController;  

    [UIView beginAnimations:@"LeftFlip" context:nil]; 
    [UIView setAnimationDuration:0.8]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:src.view.superview cache:YES]; 
    [UIView commitAnimations]; 

    [src presentViewController:dst animated:NO completion:nil]; 
}