// // NTESNavigationAnimator.m // NIM // // Created by chris on 16/1/31. // Copyright © 2016年 Netease. All rights reserved. // #import "NTESNavigationAnimator.h" #import "UIView+NTES.h" //#import "NTESMainTabController.h" #import "IfishMianTabViewController.h" @implementation NTESNavigationAnimator - (instancetype)initWithNavigationController:(UINavigationController *)navigationController { self = [super init]; if (self) { _navigationController = navigationController; } return self; } - (NSTimeInterval)transitionDuration:(id )transitionContext { return 0.35; } - (void)animateTransition:(id)transitionContext { switch (self.currentOpearation) { case UINavigationControllerOperationPop: [self popAnimation:transitionContext]; break; case UINavigationControllerOperationPush: [self pushAnimation:transitionContext]; break; default: break; } } - (void)pushAnimation:(id)transitionContext { UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIView *containerView = [transitionContext containerView]; UINavigationController *navigationController = fromViewController.navigationController; UITabBarController *tabbarController = fromViewController.tabBarController; //使用xib可能会出现view的size不对的情况 CGRect frame = fromViewController.view.frame; if ((toViewController.edgesForExtendedLayout & UIRectEdgeTop) == 0) { frame = CGRectOffset(navigationController.view.frame, 0, navigationController.navigationBar.bottom); } if ((toViewController.edgesForExtendedLayout & UIRectEdgeBottom) == 0) { CGRect slice = CGRectZero; CGRect remainder = CGRectZero; CGRectDivide(frame, &slice, &remainder, tabbarController.tabBar.height, CGRectMaxYEdge); frame = remainder; } toViewController.view.frame = frame; [containerView addSubview:fromViewController.view]; [containerView addSubview:toViewController.view]; CGFloat width = containerView.width; toViewController.view.left = width; [self callAnimationWillStart]; CGFloat duration = [self transitionDuration:transitionContext]; [UIView animateWithDuration:duration animations:^{ fromViewController.view.right = width * 0.5; toViewController.view.right = width; } completion:^(BOOL finished) { [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; [self callAnimationDidEnd]; }]; } - (void)popAnimation:(id)transitionContext { UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; CGFloat snapshootHeight = [UIApplication sharedApplication].statusBarFrame.size.height + fromViewController.navigationController.navigationBar.height; UIView *fakeBar = [fromViewController.navigationController.view resizableSnapshotViewFromRect:CGRectMake(0, 0,fromViewController.view.width, snapshootHeight) afterScreenUpdates:NO withCapInsets:UIEdgeInsetsZero]; UINavigationBar *tureBar = toViewController.navigationController.navigationBar; BOOL hidesBottomBar = toViewController.hidesBottomBarWhenPushed && self.navigationController.viewControllers.firstObject != toViewController; UITabBar *tabbar = [IfishMianTabViewController instance].tabBar; UIView *containerView = [transitionContext containerView]; [containerView addSubview:toViewController.view]; if (!hidesBottomBar) { [containerView addSubview:tabbar]; } if (self.animationType == NTESNavigationAnimationTypeCross) { [containerView addSubview:tureBar]; [fromViewController.view addSubview:fakeBar]; } [containerView addSubview:fromViewController.view]; CGFloat width = containerView.width; toViewController.view.right = width * 0.5; tabbar.right = width * 0.5; [self callAnimationWillStart]; CGFloat duration = [self transitionDuration:transitionContext]; [UIView animateWithDuration:duration animations:^{ fromViewController.view.left = width; toViewController.view.right = width; tabbar.right = width; fakeBar.alpha = 0.0; } completion:^(BOOL finished) { [[IfishMianTabViewController instance].view addSubview:tabbar]; [toViewController.navigationController.view addSubview:tureBar]; [fakeBar removeFromSuperview]; [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; [self callAnimationDidEnd]; }]; } - (void)callAnimationWillStart { if ([self.delegate respondsToSelector:@selector(animationWillStart:)]) { [self.delegate animationWillStart:self]; } } - (void)callAnimationDidEnd { if ([self.delegate respondsToSelector:@selector(animationDidEnd:)]) { [self.delegate animationDidEnd:self]; } } @end