3

I am navigating from one view controller to another.There is a default time that is specified for navigating from one class to another.Can we change that one programatically i.e. Can we increase or decrease the navigating speed.

FlashScreen *Secreen=[[FlashScreen alloc]initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:Secreen animated:YES];
Imran
  • 1,715
  • 2
  • 20
  • 42
  • 1
    you can use animation to customize your speed – Niru Mukund Shah Aug 06 '13 at 06:29
  • see http://stackoverflow.com/questions/1406037/custom-animation-for-pushing-a-uiviewcontroller – Architect Aug 06 '13 at 06:39
  • @Architect...The link that you gave me are using "setAnimationTransition".But I want the Default animation but different speed.I tried to use setAnimationTransitionNone then it is directly going to next view controller without any animation since in pushing we set animation "NO".Any Clue. – Imran Aug 06 '13 at 06:49

2 Answers2

4
You need to use a custom animation like seague Animation class file where you can give the Transition duration for moving from one view controller to another view controller

-(void)perform{
    UIViewController *sourceViewController = (UIViewController *) [self sourceViewController];
    UIViewController *destinationViewController = (UIViewController *) [self destinationViewController];
    CATransition* transition = [CATransition animation];
    if ([self.identifier isEqualToString:@"b"]){
        transition.duration = .25;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionMoveIn; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
        transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
    }else{
        transition.duration = .25;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionMoveIn;
        transition.subtype = kCATransitionFromRight;
    }
    [sourceViewController.navigationController.view.layer addAnimation:transition
                                                            forKey:kCATransition];
    [sourceViewController.navigationController pushViewController:destinationViewController animated:NO];
}
ArunMak
  • 398
  • 2
  • 12
1

You can simply add animation to any type of UIView's layer . So that it will be animated as per your configuration.

Reference of CALayer class

    //Don't forgot to import QuartzCore framework in your project
    #import <QuartzCore/QuartzCore.h>

    #define ANIMATION_DURATION 6

    /* Called when the animation begins its active duration. */
    - (void)animationDidStart:(CAAnimation *)anim{
        NSLog(@"animation start");
    }

    /* Called when the animation either completes its active duration or
     * is removed from the object it is attached to (i.e. the layer). 'flag'
     * is true if the animation reached the end of its active duration
     * without being removed. */

    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
            NSLog(@"animation stop");
    }

    -(void)PerformPushOnNavigationController{

        //Your view controller
        UIViewController *yourViewController = [[UIViewController alloc] init];


        //Create a CATransition to add it in view layer
        CATransition* TransitionFromRight = [CATransition animation];

        //Duration to animate
        TransitionFromRight.duration = ANIMATION_DURATION;

        //animation strategy to animate
        TransitionFromRight.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

        //we are going to simulate the push action of navigation controller, so here i am specifying transition type as push. Depends upon your needs of app behavior you can change it. 
        TransitionFromRight.type = kCATransitionPush;

        /*

         //type

         NSString * const kCATransitionFade;
         NSString * const kCATransitionMoveIn;
         NSString * const kCATransitionPush;
         NSString * const kCATransitionReveal;

         */


        //Here we have subtype as kCATransitionFromRight which will do animate from right. For an example i would specify kCATransitionFromBottom to push view controller to navigation controller as modal controller.
        TransitionFromRight.subtype = kCATransitionFromRight;


        /*

         //subtype

         NSString * const kCATransitionFromRight;
         NSString * const kCATransitionFromLeft;
         NSString * const kCATransitionFromTop;
         NSString * const kCATransitionFromBottom;

         */

        //set the CAAnimation delegate to self, so that it will notify you when start and stop the animation
        //Optional, If you want to do something before/after animation, use the delegate.
        //Note that CAAnimation delegate will be retained.
        //So be carefull when you use this on POP simulation.In ARC No issues. Non ARC should take care of it.
        TransitionFromRight.delegate = self;

        //Add animation to the navigation controller's view's layer
        [self.navigationController.view.layer addAnimation:TransitionFromRight forKey:nil];

        //Finally you push viewcontroller to your navigation controller.
        [self.navigationController pushViewController:yourViewController animated:NO];



    }