2013-07-01 193 views
4

親愛的核心動畫/ 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 

回答

3

有關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

謝謝,它適合我。 –

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