2012-09-24 111 views
2

我的應用程序有一堆viewControllers,我試圖設計我自己的動畫從一個viewController過渡到另一個。iPhone - 設計我自己的viewController轉換

我發現這個

- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion 

,但這似乎並沒有讓設計自己的過渡曲線。

我想要的是當新的viewControllers達到最終位置和類似的東西時創建彈性彈跳效果。我喜歡將我自己的關鍵幀添加到動畫曲線。

我該怎麼做?

感謝

回答

15

如果你想設計自己的過渡,你可以創建一個類別的UIViewController和自己編寫的動畫。只有基本的動畫已經可用。

這是你如何能做到的接口:

的* .h文件:

#import <UIKit/UIKit.h> 

@interface UIViewController(Transitions) 

- (void) presentViewController:(UIViewController *)viewController withPushDirection: (NSString *) direction; 
- (void) dismissViewControllerWithPushDirection:(NSString *) direction; 

@end 

* .m文件

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

@implementation UIViewController(Transitions) 

- (void) presentViewController:(UIViewController *)viewController withPushDirection: (NSString *) direction { 

    [CATransaction begin]; 

    CATransition *transition = [CATransition animation]; 
    transition.type = kCATransitionPush; 
    transition.subtype = direction; 
    transition.duration = 0.25f; 
    transition.fillMode = kCAFillModeForwards; 
    transition.removedOnCompletion = YES; 

    [[UIApplication sharedApplication].keyWindow.layer addAnimation:transition forKey:@"transition"];   
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 
    [CATransaction setCompletionBlock:^{ 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(transition.duration * NSEC_PER_SEC)), dispatch_get_main_queue(),^{ 
      [[UIApplication sharedApplication] endIgnoringInteractionEvents];   
     }); 
    }]; 

    [self presentViewController:viewController animated:NO completion:NULL]; 

    [CATransaction commit]; 

} 

- (void) dismissViewControllerWithPushDirection:(NSString *) direction { 

    [CATransaction begin]; 

    CATransition *transition = [CATransition animation]; 
    transition.type = kCATransitionPush; 
    transition.subtype = direction; 
    transition.duration = 0.25f; 
    transition.fillMode = kCAFillModeForwards; 
    transition.removedOnCompletion = YES; 

    [[UIApplication sharedApplication].keyWindow.layer addAnimation:transition forKey:@"transition"];   
    [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 
    [CATransaction setCompletionBlock:^{ 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(transition.duration * NSEC_PER_SEC)), dispatch_get_main_queue(),^{ 
      [[UIApplication sharedApplication] endIgnoringInteractionEvents];   
     }); 
    }]; 

    [self dismissViewControllerAnimated:NO completion:NULL]; 

    [CATransaction commit]; 

} 

@end 

,這是一個示例調用:

[self presentViewController: myVC withPushDirection:@"fromRight"]; 
+0

謝謝。我已經驗證它可以與關鍵幀動畫一起使用。謝謝。 – SpaceDog

+0

我敢打賭,你的動畫看起來不錯 - 你介意分享嗎? – user387184

+0

我還沒有實質性的好,我剛剛創建了一些簡單的關鍵幀動畫來測試這個答案是否可行。 – SpaceDog

相關問題