iOS --- 自定义过渡

iOS7支持两种自定义过渡: 自定义视图控制器过渡和交互式视图控制器过渡。

过渡协调器(transitionCoordinator):所有的过渡都会创建一个过渡协调器。

自定义视图过渡:UIViewControllerAnimatedTransitioning

- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext
{
    //系统动画花费的时间
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController *src = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *dest = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    //真正的动画代码
    [transitionContext completeTransition:YES];
}
//动画完成之后,调用completeTransition:方法通知系统过渡完成

交互控制器:UIViewControllerInteractiveTransitioning

- (void)startInteractiveTransition:(id <UIViewControllerContextTransitioning>)transitionContext;

交互控制器实现了 UIViewControllerInteractiveTransitioning的协议。交互式过渡的交互控制器应当是UIPercentDrivenInteractiveTransition的子类;

- (void)updateInteractiveTransition:(CGFloat)percentComplete;
- (void)cancelInteractiveTransition;
- (void)finishInteractiveTransition;

 

UIViewControllerAnimatedTransitioning

//动画控制器
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;

//交互控制器
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator;
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator;

 : 交互式过渡不支持CATransiton或CALayer动画。

 

RMPZoomTransitionAnimator的使用:

Push&Pop

1、 实现UINavigationControllerDelegate协议  RMPZoomTransitionAnimating协议

2、 #import "RMPZoomTransitionAnimator.h"

#pragma mark - <UINavigationControllerDelegate>

- (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                   animationControllerForOperation:(UINavigationControllerOperation)operation
                                                fromViewController:(UIViewController *)fromVC
                                                  toViewController:(UIViewController *)toVC
{
    id <RMPZoomTransitionAnimating, RMPZoomTransitionDelegate> sourceTransition = (id<RMPZoomTransitionAnimating, RMPZoomTransitionDelegate>)fromVC;
    id <RMPZoomTransitionAnimating, RMPZoomTransitionDelegate> destinationTransition = (id<RMPZoomTransitionAnimating, RMPZoomTransitionDelegate>)toVC;
    if ([sourceTransition conformsToProtocol:@protocol(RMPZoomTransitionAnimating)] &&
        [destinationTransition conformsToProtocol:@protocol(RMPZoomTransitionAnimating)]) {
        RMPZoomTransitionAnimator *animator = [[RMPZoomTransitionAnimator alloc] init];
        animator.goingForward = (operation == UINavigationControllerOperationPush);
        animator.sourceTransition = sourceTransition;
        animator.destinationTransition = destinationTransition;
        return animator;
    }
    return nil;
}

 

#pragma mark -<RMPZoomTransitionAnimating>
//过渡图片
- (UIImageView *)transitionSourceImageView
{
    UIImage *image = [UIImage imageNamed:@"图片名"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.contentMode = 过渡图片.contentMode;
    imageView.clipsToBounds = YES;
    imageView.userInteractionEnabled = NO;
    imageView.frame = 过渡图片.frame;
    return imageView;
}

- (UIColor *)transitionSourceBackgroundColor
{
       return self.view.backgroundColor;
}

- (CGRect)transitionDestinationImageViewFrame
{
    return 过渡图片.frame;;
}

//返回pop VC
#pragma mark - <RMPZoomTransitionDelegate>
- (void)zoomTransitionAnimator:(RMPZoomTransitionAnimator *)animator
         didCompleteTransition:(BOOL)didComplete
      animatingSourceImageView:(UIImageView *)imageView
{
        self.mainImageView.image = imageView.image;
}

 

Pre&Diss 模态样式

1、 实现UINavigationControllerDelegate协议  RMPZoomTransitionAnimating协议

2、 #import "RMPZoomTransitionAnimator.h"

#pragma mark - <UIViewControllerTransitioningDelegate>

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented
                                                                  presentingController:(UIViewController *)presenting
                                                                      sourceController:(UIViewController *)source
{
    id <RMPZoomTransitionAnimating, RMPZoomTransitionDelegate> sourceTransition = (id<RMPZoomTransitionAnimating, RMPZoomTransitionDelegate>)source;
    id <RMPZoomTransitionAnimating, RMPZoomTransitionDelegate> destinationTransition = (id<RMPZoomTransitionAnimating, RMPZoomTransitionDelegate>)presented;
    if ([sourceTransition conformsToProtocol:@protocol(RMPZoomTransitionAnimating)] &&
        [destinationTransition conformsToProtocol:@protocol(RMPZoomTransitionAnimating)]) {
        RMPZoomTransitionAnimator *animator = [[RMPZoomTransitionAnimator alloc] init];
        animator.goingForward = YES;
        animator.sourceTransition = sourceTransition;
        animator.destinationTransition = destinationTransition;
        return animator;
    }
    return nil;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    id <RMPZoomTransitionAnimating, RMPZoomTransitionDelegate> sourceTransition = (id<RMPZoomTransitionAnimating, RMPZoomTransitionDelegate>)dismissed;
    id <RMPZoomTransitionAnimating, RMPZoomTransitionDelegate> destinationTransition = (id<RMPZoomTransitionAnimating, RMPZoomTransitionDelegate>)self;
    if ([sourceTransition conformsToProtocol:@protocol(RMPZoomTransitionAnimating)] &&
        [destinationTransition conformsToProtocol:@protocol(RMPZoomTransitionAnimating)]) {
        RMPZoomTransitionAnimator *animator = [[RMPZoomTransitionAnimator alloc] init];
        animator.goingForward = NO;
        animator.sourceTransition = sourceTransition;
        animator.destinationTransition = destinationTransition;
        return animator;
    }
    return nil;
}

RMPZoomTransitionAnimator代理事件同上。

 

posted @ 2015-11-24 16:23  ly1992  阅读(250)  评论(0)    收藏  举报