一丶效果
OneViewController 的 ImageView和label 切換到TwoViewController的轉(zhuǎn)場動畫;
二丶原理及實現(xiàn)方式;
利用<UINavigationControllerDelegate>的自定義UIViewControllerAnimatedTransitioning方法;
實現(xiàn)方式:
1.OneVc上有:oneImageView;
2.TwoVc上有:twoImageView;
通過截圖oneImageView生成view添加到containerView;
對containerView做過渡動畫即可;
三丶代碼
自己封裝了一個XZB_Transition(https://github.com/k373379320/ZBTransitionTest)
使用:
//翻轉(zhuǎn)OneVc
1.
#import "ZC1ViewController.h"
2.
添加UINavigationControllerDelegate>
3.
self.navigationController.delegate = self;
4.
#pragma mark <UINavigationControllerDelegate>
- (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC{
if ([toVC isKindOfClass:[ZC2ViewController class]]) {
XZB_Transition *transition = [XZB_Transition transitionWithViewArray:@[@[@"mainImageView",@"mainImageView"],@[@"titleLabel",@"titleLabel"]]];
return transition;
}else{
return nil;
}
}
注意:
就一個類方法;使用注意格式別錯了,沒有容錯代碼,按格式來;
由于采用kvc的方式實現(xiàn),格式如下:
傳入:二維數(shù)組,@[@[原圖控件name1,結(jié)果圖控件name1],@[原圖控件name2,結(jié)果圖控件name2]];
例子:
@[@[@"mainImageView",@"mainImageView"]]
+ (instancetype)transitionWithViewArray:(NSArray *)array;
四丶,代碼講解:
#import "XZB_Transition.h"
#import "UIView+MotionBlur.h"
#import "UIImage+Capture.h"
@interface XZB_Transition ()
@property (nonatomic, strong) NSArray *transitionViewArray;
@end
@implementation XZB_Transition
#pragma mark - 生命周期
#pragma mark - api
+ (instancetype)transitionWithViewArray:(NSArray *)array
{
XZB_Transition *transition = [[XZB_Transition alloc]init];
transition.transitionViewArray = array;
return transition;
}
#pragma mark - getter / setter
#pragma mark - model event
#pragma mark - view event
#pragma mark - private
/**
動畫持續(xù)時間
*/
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
return 0.7f;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
//獲取從哪里來的控制器
UIViewController *fromVC = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
//獲取到哪里去的控制器
UIViewController *toVC = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
toVC.view.frame = [transitionContext finalFrameForViewController:toVC];
toVC.view.alpha = 0;
//轉(zhuǎn)場需要動畫的視圖數(shù)組
NSMutableArray *animationViewsArray = [[NSMutableArray alloc] init];
//做動畫的視圖,注意添加順序,層次;
UIView *containerView = [transitionContext containerView];
[containerView addSubview:toVC.view];
@autoreleasepool {
for (NSArray *startToEndViewArray in self.transitionViewArray)
{
//來源視圖處理指針
UIView *fromVcAnimationView = nil;
//最終視圖處理指針
UIView *toVcAnimationView = nil;
//做動畫的視圖指針
UIImageView *animationImageView = nil;
{
fromVcAnimationView = [fromVC valueForKey:startToEndViewArray[0]];
//截圖
animationImageView = [[UIImageView alloc] initWithImage:[UIImage captureWithView:fromVcAnimationView]];
animationImageView.frame = fromVcAnimationView.frame;
[containerView addSubview:animationImageView];
}
toVcAnimationView = [toVC valueForKey:startToEndViewArray[1]];
fromVcAnimationView.hidden = YES;
toVcAnimationView.hidden = YES;
//原圖,結(jié)果圖,動畫圖
[animationViewsArray addObject:@[fromVcAnimationView,toVcAnimationView,animationImageView]];
}
}
//動畫效果
NSTimeInterval duration = [self transitionDuration:transitionContext];
[UIView animateWithDuration:duration delay:0.0f usingSpringWithDamping:0.7f initialSpringVelocity:1.0f options:UIViewAnimationOptionCurveLinear animations:^{
toVC.view.alpha = 1.0;
for (NSArray *animationArray in animationViewsArray)
{
UIImageView *animationImageView = animationArray[2];
UIView *resultsView = animationArray[1];
//frame變換
animationImageView.frame = [containerView convertRect:resultsView.frame fromView:resultsView.superview];
}
} completion:^(BOOL finished) {
if (!finished)return ;
for (NSArray *animationArray in animationViewsArray)
{
UIView *fromVcAnimationView = animationArray[0];
UIView *toVcAnimationView = animationArray[1];
UIImageView *animationImageView = animationArray[2];
fromVcAnimationView.hidden = NO;
toVcAnimationView.hidden = NO;
//刪除做動畫view
[animationImageView removeFromSuperview];
}
//結(jié)束動畫,必須調(diào)用;
[transitionContext completeTransition:!transitionContext.transitionWasCancelled];
}];
}
XZB_Transition: <a >XZB_Transition</a>