自定义转场动画(二)
来源:互联网 发布:土豆视频mac版 编辑:程序博客网 时间:2024/06/03 20:04
之前介绍一篇文章 自定义转场动画(一),主要介绍了Present的转场动画。今天介绍一下有关Push的转场动画。
准备:首先要两个UIViewController和一个继承与UIPercentDrivenInteractiveTransition的类。
ViewController1ViewController2PushTransitionAnimator
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,原理相同。
0 0
- 自定义转场动画(二)
- 自定义转场动画(一)
- iOS之转场动画/自定义转场动画
- iOS自定义转场动画(上)
- iOS自定义转场动画(下)
- 自定义presentViewController的转场动画(Swift)
- Swift 自定义转场动画 (没有封装)
- iOS自定义转场动画
- iOS自定义转场动画
- 自定义转场动画
- IOS 自定义转场动画。
- 自定义Navigation转场动画
- Swift自定义转场动画
- iOS自定义转场动画
- UIPresentationController自定义转场动画
- UITabBarController自定义转场动画
- Modal自定义转场动画
- iOS 自定义转场动画
- eclipse怎样配置Tomcat服务器
- HDU2544 最短路
- java程序设计基础(1)
- [Unity基础]项目专属文件夹
- 数据结构学习笔记--树
- 自定义转场动画(二)
- 1002. 写出这个数 (20)
- bootstrap排版
- git学习
- FATAL: the database system is starting up
- win7/win10 64位 常见收费软件安装教程
- digraph
- sql 语句拼接 游标遍历和函数遍历
- 初识Mongodb