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代理事件同上。

浙公网安备 33010602011771号