首先看一個(gè)簡單的 效果圖
模擬器不知道怎么了 變得這么慢跃闹,就將就著看吧
關(guān)于轉(zhuǎn)場動(dòng)畫我們主要考慮兩個(gè),一個(gè)是導(dǎo)航條中的 轉(zhuǎn)場就是(push凑兰、pop) 挠进,另外一個(gè)就是 present 和dismiss
1. push、pop 的轉(zhuǎn)場
關(guān)于push 和 pop 我們首先要先設(shè)置self.navigationController.delegate = self; (這個(gè)self 就是 VC控制器)咕娄,然后我們找到這個(gè)導(dǎo)航條的代理
- (id<UIViewControllerAnimatedTransitioning>) navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {
if (operation == UINavigationControllerOperationPush) {
return _pushAnimation;
}else if (operation == UINavigationControllerOperationPop) {
return _popAnimation;
}else{
return nil;
}
}
這里面的_pushAnimation 和 _popAnimation是我接下來需要講的動(dòng)畫亥揖。
PushAnimation 的設(shè)置 (PopAnimation 其實(shí)也是一樣)
這里首先要 實(shí)現(xiàn) UIViewControllerAnimatedTransitioning 這個(gè)ios7 以后的一個(gè)代理,然后我們找到這個(gè)delegate 中的兩個(gè)必須實(shí)現(xiàn)的方法 1.- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext 顯然這個(gè)是返回動(dòng)畫時(shí)間的代理圣勒;- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext,就是把一些動(dòng)畫的交互寫在這里
//
// PushAnimation.h
// 轉(zhuǎn)場動(dòng)畫
//
// Created by apple on 16/6/22.
// Copyright ? 2016年 李重陽. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIViewControllerTransitioning.h>
@interface PushAnimation : NSObject<UIViewControllerAnimatedTransitioning>
@end
//
// PushAnimation.m
// 轉(zhuǎn)場動(dòng)畫
//
// Created by apple on 16/6/22.
// Copyright ? 2016年 李重陽. All rights reserved.
//
#import "PushAnimation.h"
@implementation PushAnimation
/* 動(dòng)畫持續(xù)的時(shí)間 **/
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
return 1.0;
}
/*動(dòng)畫交互 **/
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
//目的ViewController
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
//起始ViewController
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
//添加toView到上下文的視圖中
UIView * containerView = [transitionContext containerView];
/* 加入 目的 控制器的View**/
[containerView addSubview:toViewController.view];
[containerView bringSubviewToFront:fromViewController.view];
//自定義動(dòng)畫
toViewController.view.transform = CGAffineTransformMakeTranslation(-320, 0);
[UIView animateWithDuration:[self transitionDuration:transitionContext]
animations:^{
fromViewController.view.transform = CGAffineTransformMakeTranslation(320, 0);
toViewController.view.transform = CGAffineTransformIdentity;
} completion:^(BOOL finished) {
fromViewController.view.transform = CGAffineTransformIdentity;
// 聲明過渡結(jié)束時(shí)調(diào)用 completeTransition: 這個(gè)方法
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
@end
2. present 和dismiss 的轉(zhuǎn)場
其實(shí)和pop 差不多 只不過有兩點(diǎn)不同
1.控制器需要實(shí)現(xiàn)UIViewControllerTransitioningDelegate這個(gè)代理
2.就是在轉(zhuǎn)場的時(shí)候 當(dāng)dismiss 的時(shí)候 要UIView * snapshotView = [fromViewController.view snapshotViewAfterScreenUpdates:YES];截個(gè) 源控制器的屏摧扇,可能是因?yàn)閐ismiss 后源控制器馬上釋放掉了圣贸。
- (IBAction)present:(id)sender {
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController3 * vc3 = [storyboard instantiateViewControllerWithIdentifier:@"ViewController3"];
vc3.transitioningDelegate = self;
[self presentViewController:vc3 animated:YES completion:nil];
}
#pragma mark - UIViewControllerTransitioningDelegate
-(id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
_presentOrDismissAnimation.animationType = AnimationTypePresent;
return _presentOrDismissAnimation;
}
-(id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
_presentOrDismissAnimation.animationType = AnimationTypeDismiss;
return _presentOrDismissAnimation;
}
//
// PresentOrDismissAnimation.h
// 轉(zhuǎn)場動(dòng)畫
//
// Created by apple on 16/6/22.
// Copyright ? 2016年 李重陽. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
typedef enum {
AnimationTypePresent,
AnimationTypeDismiss
} AnimationType;
@interface PresentOrDismissAnimation : NSObject<UIViewControllerAnimatedTransitioning>
@property (nonatomic, assign) AnimationType animationType;
@end
//
// PresentOrDismissAnimation.m
// 轉(zhuǎn)場動(dòng)畫
//
// Created by apple on 16/6/22.
// Copyright ? 2016年 李重陽. All rights reserved.
//
#import "PresentOrDismissAnimation.h"
@implementation PresentOrDismissAnimation
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
return 3;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
//目的ViewController
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
//起始ViewController
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
//添加toView到上下文的視圖中
UIView * containerView = [transitionContext containerView];
[containerView addSubview:toViewController.view];
if (self.animationType == AnimationTypePresent) {
toViewController.view.transform = CGAffineTransformMakeTranslation(0, -568);
//進(jìn)行動(dòng)畫
[UIView animateWithDuration:[self transitionDuration:transitionContext]
delay:0
usingSpringWithDamping:.5
initialSpringVelocity:.6
options:UIViewAnimationOptionCurveLinear
animations:^{
toViewController.view.transform = CGAffineTransformIdentity;
} completion:^(BOOL finished) {
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}else {
/* dismiss 的時(shí)候 fromView 會(huì)馬上消失掉了,所以先截個(gè)屏幕**/
UIView * snapshotView = [fromViewController.view snapshotViewAfterScreenUpdates:YES];
[transitionContext.containerView addSubview:snapshotView];
//進(jìn)行動(dòng)畫
[UIView animateWithDuration:[self transitionDuration:transitionContext]
delay:0
usingSpringWithDamping:0.5
initialSpringVelocity:0
options:UIViewAnimationOptionCurveLinear
animations:^{
snapshotView.transform = CGAffineTransformMakeTranslation(0, 568);
} completion:^(BOOL finished) {
[snapshotView removeFromSuperview];
//結(jié)束Transition
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
}
@end