OC UINavigationController push pop自定义动画

1. DSLTransitionFromFirstToSecond

#import <UIKit/UIKit.h>
@interface DSLTransitionFromFirstToSecond : NSObject<UIViewControllerAnimatedTransitioning>
/**
 isPresenting是否是pop动画,
*/

@property (nonatomic, assign) BOOL isPresenting;
@end
#import "DSLTransitionFromFirstToSecond.h"

@implementation DSLTransitionFromFirstToSecond

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
    return 3;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    /**
     *  dismissing
     */

    //isPresenting如果为YES就是pop动画,为NO就是
    if (self.isPresenting) {
        [self executeDismissAnimation:transitionContext];
    } else {
        [self executePresentationAnimation:transitionContext];
    }
}

/**
 *  present 动画
 *
 *  @param transitionContext
 */
- (void)executePresentationAnimation:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    UIView *containerView = [[UIApplication sharedApplication] keyWindow];

    CGRect frame = containerView.bounds;
    frame.origin.y = -CGRectGetHeight(frame);
    toViewController.view.frame = frame;
    [containerView addSubview:toViewController.view];

    NSTimeInterval duration = [self transitionDuration:transitionContext];

    frame.origin.y = 0;
    [UIView animateWithDuration:duration animations:^{
        toViewController.view.frame = frame;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}

/**
 *  dismiss 动画
 *
 *  @param transitionContext
 */
- (void)executeDismissAnimation:(id<UIViewControllerContextTransitioning>)transitionContext
{

    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    UIView *containerView = [[UIApplication sharedApplication] keyWindow];

    CGRect frame = containerView.bounds;
    frame.origin.y = - CGRectGetHeight(frame);

    toViewController.view.userInteractionEnabled = YES;

    [transitionContext.containerView addSubview:toViewController.view];
    [transitionContext.containerView addSubview:fromViewController.view];

    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
        toViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
        fromViewController.view.frame = frame;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}

viewcontorller:代码

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    NSLog(@"===============");

    // 让我自己变成navigationController的delegate
    self.navigationController.delegate = self;
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    // 我不再是 navigationController 的代理啦
    if (self.navigationController.delegate == self) {
        self.navigationController.delegate = nil;

               ;
    }
}

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                  animationControllerForOperation:(UINavigationControllerOperation)operation
                                               fromViewController:(UIViewController *)fromVC
                                                 toViewController:(UIViewController *)toVC {

        DSLTransitionFromFirstToSecond *second =[[DSLTransitionFromFirstToSecond alloc] init];
        second.isPresenting = NO;
        return second;

}

- (IBAction)alertBtnClick:(UIButton *)sender {

    [self.navigationController pushViewController:[FirstViewController new] animated:YES];
}

FirstViewController:

-(DSLTransitionFromFirstToSecond *)second{
    if(!_second)
    {
        _second = [[DSLTransitionFromFirstToSecond alloc]init];
        _second.isPresenting = YES;
    }
    return _second;
}

- (id<UIViewControllerAnimatedTransitioning>) navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC

{

    /**

     *  typedef NS_ENUM(NSInteger, UINavigationControllerOperation) {

     *     UINavigationControllerOperationNone,

     *     UINavigationControllerOperationPush,

     *     UINavigationControllerOperationPop,

     *  };

     */
    //push的时候用我们自己定义的customPush
    if (operation == UINavigationControllerOperationPop
        ) {

        NSLog(@"========");

        return self.second;

    }else{

        return nil;

    }

}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];

     self.navigationController.delegate = self;

    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 50)];
    [self.view addSubview:btn];
    btn.backgroundColor = [UIColor yellowColor];
    [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];

}

-(void)btnClick{

    [self.navigationController popViewControllerAnimated:YES];

}
时间: 2024-11-05 06:12:17

OC UINavigationController push pop自定义动画的相关文章

ViewController push的自定义动画

CATransition *transition = [CATransition animation]; transition.duration = 1.0f; transition.subtype = kCATransitionFromTop;//可更改为其他方式 transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition

自定义UINavigationController push和pop动画

http://segmentfault.com/q/1010000000143983 默认的UINavigationController push和pop的默认动画都是左右滑动推出,我的应用要求这种界面切换的动画效果复杂一点,大概有这么几个: 更快的左右推出,默认是0.3秒,我需要快一倍 带抖动的左右推出 水平翻转 纸张翻页效果 但是这些切换都要放在NavigationController里做管理,怎么实现,求个思路 ios 链接 评论 更多 默认排序时间排序 3 个回答 答案对人有帮助,有参考

iOS利用Runtime自定义控制器POP手势动画

前言 苹果在iOS 7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操作. nav_pop_origin.gif 这个操作的想法非常好,但是系统给我们规定的范围必须是屏幕左侧边缘才可以触发,这样实际使用过程中对于有些产品会产生不便,于是有些app就采取整个屏幕都响应这个手势并且pop动画还是用系统原生的,这样操作起来确实方便好多. nav_pop_custom.gif

iOS7新特性 ViewController转场切换(二) 系统视图控制器容器的切换动画---push pop present dismis

@上一章,介绍了主要的iOS7所增加的API,可以发现,它们不是一个个死的方法,苹果给我们开发者提供的是都是协议接口,所以我们能够很好的单独提出来写成一个个类,在里面实现我们各种自定义效果.        1.先来看看实现UIViewControllerAnimatedTransitioning的自定义动画类 /** * 自定义的动画类 * 实现协议------>@protocol UIViewControllerAnimatedTransitioning * 这个接口负责切换的具体内容,也即&qu

Runtime__iOS利用Runtime自定义控制器POP手势动画

前言 苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操作. nav_pop_origin.gif 这个操作的想法非常好,但是系统给我们规定的范围必须是屏幕左侧边缘才可以触发,这样实际使用过程中对于有些产品会产生不便,于是有些app就采取整个屏幕都响应这个手势并且pop动画还是用系统原生的,这样操作起来确实方便好多. nav_pop_custom.gif

UINavigationController 多次连续 Push Pop 问题

最近要实现一个 连续 pop 两次 又 Push 一个新的 MVC 的需求,所以把经历写出来分享一下. NavgationController 是 iOS 中最常用的控制器了,先看官网文档: The UINavigationController class implements a specialized view controller that manages the navigation of hierarchical content. This navigation interface m

iOS利用Runtime自定义控制器POP手势动画(经典)

前言 苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操作. nav_pop_origin.gif 这个操作的想法非常好,但是系统给我们规定的范围必须是屏幕左侧边缘才可以触发,这样实际使用过程中对于有些产品会产生不便,于是有些app就采取整个屏幕都响应这个手势并且pop动画还是用系统原生的,这样操作起来确实方便好多. nav_pop_custom.gif

iOS7 push/pop转场动画

前言 iOS 7之后,苹果提供了自定义转场动画的API,我们可以自己去定义任意动画效果.本篇为笔者学习push.pop自定义转场效果的笔记,如何有任何不正确或者有指导意见的,请在评论中留下您的宝贵意见!!! 请注意:如果要求支持iOS 7以下版本,则不可使用此效果. 实现目标效果 我们本篇文章目标效果: 视图切换种类 如下效果图,这是有两大类视图切换动画的,一种是交互式的,另一种就是自定义的. 本篇只讲其中的UIViewControllerAnimatedTransitioning协议,来实现p

ios7 push pop 动画突然消失的解决方案

不想看扯淡的同学,直接拉倒底部查看.......... 这几天开发的程序遇到了这样的问题. 突然之前在ios7运行的程序全无动画效果. 系统自带的push pop之类的也完全没有动画效果,就好像view直接add上去的一样. 蛋疼.... 查看了下代码.. 完全不知道该如何下手了. 怎么办.. 百度 谷歌... 关键字:ios7 动画效果消失 出现如下界面... 这他妈是什么啊... 换谷歌.. 谷歌还是比百度靠谱,但是点进去发现.这也只是跟我一样出现了这些现象提出来的问题,但是解决方案呢,wh