UIView核心动画翻转动画

问题描述:

亲爱的核心动画/ iOS专家,UIView核心动画翻转动画

我想获得类似于下面的问题的效果。

Core animation animating the layer to flip horizontally

接受的答案似乎来形容正是我需要,但有这样的回答没有代码,我不能让我写工作的任何代码。 1)有1个主视图控制器/视图,并且在主视图的一部分上有2个重叠的UIView,只显示一个(1在前面',在'后面'有1个)
2)单独的UIControl/UIButton被按下,然后发生3D翻转过渡,将前部(可见)视图旋转到视野之外,同时将后部(隐藏)视图旋转到前面......就像看到扑克牌的反面一样。
3)能够继续按压UIControl在两个视图之间切换
4)只能与前视图上的控件进行交互(即按下前一层不会无意中触发后面的控件)恰好在水龙头下面)

我可能正在接近这个错误的方式让我知道。理想情况下,我想使用核心动画,而不是使用翻转事务构建的UIView,因为我希望动画是3D,并且还希望将此任务用作执行更复杂的CA事务的垫脚石。

目前,我可以正视图很好地翻转(只有一次),但后视图不显示。

干杯,
安迪

这里是我已经得到了代码:

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 

有关iOS中翻转动画的快速提示 - 在开始翻转动画之前,系统需要时间渲染后视图(将翻转的视图)。因此,如果您尝试更改该视图的内容,并以相同方法触发翻转动画,则会出现问题。

要解决这个问题,我已经受够了代码的成功是这样的:

- (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) { 
        } 
    ]; 
} 

概括地说,我在flipView方法设置的一切行动,控制返回到iOS所以有时间来做它的渲染,然后在十分之一秒后启动flipTile选择器来做实际的动画。

祝你好运!

+2

不应该这是'[self performSelector:@selector(performFlip)withObject:nil afterDelay:0.1];'使用performFlip而不是flipTile? – DelightedD0D

+1

好的。固定。 – Axeva

+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]; 
}