自定義轉場動畫(二)
之前介紹一篇文章 自定義轉場動畫(一),主要介紹了Present的轉場動畫。今天介紹一下有關Push的轉場動畫。
準備:首先要兩個UIViewController和一個繼承與UIPercentDrivenInteractiveTransition的類。
ViewController1
ViewController2
PushTransitionAnimator
PushTransitionAnimator
.h
@interface PushTransitionAnimator : UIPercentDrivenInteractiveTransition<UIViewControllerAnimatedTransitioning,UIViewControllerTransitioningDelegate,UIGestureRecognizerDelegate>
@property (nonatomic, assign) BOOL isPop;//是push還是pop
.m
完成UIViewControllerAnimatedTransitioning協議
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
return self.transitionDuration;
}
//這裡實現從下往上的Push
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
self.targetViewController = toViewController;
[self creatDragGesture];
UIView *containerView = [transitionContext containerView];
if (!self.isPop) {
CGRect startRect;
[containerView addSubview:toViewController.view];
toViewController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
startRect = CGRectMake(0, CGRectGetHeight(containerView.bounds), CGRectGetWidth(containerView.bounds), CGRectGetHeight(containerView.bounds));
toViewController.view.frame = startRect;
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
fromViewController.view.alpha = self.behindViewAlpha;
toViewController.view.frame = CGRectMake( 0, 0,
CGRectGetWidth(toViewController.view.frame),
CGRectGetHeight(toViewController.view.frame) );
} completion:^(BOOL finished) {
[fromViewController endAppearanceTransition];
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}else{
[containerView addSubview:toViewController.view];
toViewController.view.alpha = self.behindViewAlpha;
CGRect endRect;
endRect = CGRectMake(0, CGRectGetHeight(fromViewController.view.frame), CGRectGetWidth(fromViewController.view.frame), CGRectGetHeight(fromViewController.view.frame));
[toViewController beginAppearanceTransition:YES animated:YES];
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
toViewController.view.alpha = 1.0f;
fromViewController.view.frame = endRect;
} completion:^(BOOL finished) {
[toViewController endAppearanceTransition];
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
}
如何使用
Push與Present最直觀的區別就是有導航的參與。所以我們要在ViewController1中準守 UINavigationControllerDelegate 協議。
初始化 設定導航代理
- (void)viewDidLoad {
[super viewDidLoad];
_animator = [[PXPushTransitionAnimation alloc] initWithModalViewController:self];
_animator.dragable = YES;
_animator.bounces = YES;
_animator.behindViewAlpha = 0.3;
_animator.transitionDuration = 0.35f;
_animator.behindViewScale = 1.0f;
....
}
- (void)viewDidAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.navigationController.delegate = self;
}
實現代理方法
#pragma mark - **************** Navgation delegate
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC
{
if (operation == UINavigationControllerOperationPush) {
self.animator.isPop = NO;//push
}else if (operation == UINavigationControllerOperationPop){
self.animator.isPop = YES;//pop
}
return self.animator;
}
有關手勢的返回互動可以參考present,原理相同。
相關文章
- TransitionAnimation自定義轉場動畫NaN動畫
- 自定義轉場動畫(一)動畫
- iOS自定義轉場動畫(push、pop動畫)iOS動畫
- 一行程式碼實現自定義轉場動畫--iOS自定義轉場動畫集行程動畫iOS
- 自定義present和dismiss的轉場動畫動畫
- 自定義TabBar動畫效果 - 頁面轉場(Swift)tabBar動畫Swift
- iOS自定義轉場動畫實戰講解iOS動畫
- iOS CAAnimation之CATransition (自定義轉場動畫工具類)iOS動畫
- iOS 關於viewController自定義的轉場動畫iOSViewController動畫
- 關於自定義轉場動畫,我都告訴你。動畫
- jQuery動畫—自定義動畫animate()jQuery動畫
- 安卓Property Animator動畫詳解(二)-自定義屬性安卓動畫
- 自定義過渡動畫動畫
- 自定義動畫方法animate()動畫
- 自定義波紋動畫動畫
- 【Jquery】jquery 自定義動畫jQuery動畫
- Flutter動畫之自定義動畫元件-FlutterLayoutFlutter動畫元件
- [譯]Workcation App – 第一部分 . 自定義 Fragment 轉場動畫APPFragment動畫
- Android SeekBar 自定義thumb,thumb旋轉動畫效果Android動畫
- iOS自定義UIView動畫效果iOSUIView動畫
- 搞定動畫之 JQuery 中的自定義動畫動畫jQuery
- XamarinAndroid元件教程設定自定義子元素動畫(二)NaNAndroid元件動畫
- 自定義Push/Pop和Present/Dismiss轉場
- Java 給PPT新增動畫效果(預設動畫/自定義動畫)Java動畫
- Flutter自定義CupertinoPageRoute進入動畫Flutter動畫
- 屬性動畫:如何自定義View動畫View
- iOS自定義 Transitions 動畫總結iOS動畫
- react-navigation自定義StackNavigator頁面跳轉動畫ReactNavigation動畫
- 萬彩動畫大師教程 | 自定義動畫函式動畫函式
- Flutter 建立自定義路由過渡動畫Flutter路由動畫
- Android自定義View播放Gif動畫AndroidView動畫
- Android 自定義View之下雨動畫AndroidView動畫
- android簡單的自定義動畫Android動畫
- Qt自定義動畫插值函式QT動畫函式
- 動畫函式的繪製及自定義動畫函式動畫函式
- Android動畫效果之自定義ViewGroup新增布局動畫Android動畫View
- jQuery的三組基本動畫與自定義動畫總結jQuery動畫
- 自定義鍵盤(二)