您的位置:首页 > 移动开发 > IOS开发

iOS --- 自定义过渡

2015-11-24 16:23 447 查看
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代理事件同上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: