Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

transitionFromView:toView:duration:options:completion: is not animating the transition

I have a view controller that displays the views of 2 sub view controllers in a given area of its view. The 2 sub view controllers are FlopVC and FipVC.

I want to animate the transition from one sub view to the other. The code I'm using is:

-(IBAction)flip:(id)sender{

    UIViewController *newVC = nil;

    if (self.isFlip) {
        newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil];
    }else{
        newVC = [[FipVC alloc] initWithNibName:nil bundle:nil];
    }

    newVC.view.frame = CGRectMake(120, 20, 240, 260);
    [self.view addSubview:newVC.view];

    [UIView transitionFromView:self.currentVC.view
                        toView:newVC.view
                      duration:0.9
                       options:UIViewAnimationTransitionFlipFromLeft 
                    completion:^(BOOL finished) {
                        self.currentVC = newVC;
                        self.isFlip = ! self.isFlip;
                    }];



}

The sub views are swapped, but without any animation. What am I doing wrong?

PS the full project is here.

like image 915
cfischer Avatar asked Oct 28 '11 22:10

cfischer


3 Answers

UIViewAnimationTransitionFlipFromLeft != UIViewAnimationOptionTransitionFlipFromLeft
like image 50
djromero Avatar answered Oct 14 '22 17:10

djromero


if you are using the new iOS5 view container paradigm you need to do something along the lines of the following:

-(IBAction)flip:(id)sender{

    UIViewController *newVC = nil;

    if (self.isFlip) {
       newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil];
    }else{
       newVC = [[FipVC alloc] initWithNibName:nil bundle:nil];
    }

    newVC.view.frame = CGRectMake(120, 20, 240, 260);

    // required for the new viewController container
    self.currentVC willMoveToParentViewController:nil];
    [self addChildViewController:newVC];
    [self transitionFromViewController:self.currentVC
                  toViewViewController:newVC.view
                              duration:0.9
                               options: UIViewAnimationOptionTransitionFlipFromLeft 
                            animations:nil
                            completion:^(BOOL finished) {
                               // required for the new viewController container
                               [self.currentVC removeFromParentViewController];
                               [newVC didMoveToParentViewController:self];

                               self.currentVC=newVC;
                             }];



}

reference the section Implementing a Container View Controller and the 2011 WWDC videos on UIViewController containers for more info.

like image 28
timthetoolman Avatar answered Oct 14 '22 17:10

timthetoolman


Here is working code that (by sheer coincidence) does exactly what you're describing. My two child vc's are stored in self->swappers. The integer cur keeps track of which one is currently showing. The spot in my interface where the subview is to go is marked by a view outlet, panel.

UIViewController* fromvc = [self->swappers objectAtIndex:cur];
cur = (cur == 0) ? 1 : 0;
UIViewController* tovc = [self->swappers objectAtIndex:cur];
tovc.view.frame = self.panel.bounds;

// must have both as children before we can transition between them
[self addChildViewController:tovc]; // "will" called for us
// note: when we call remove, we must call "will" (with nil) beforehand
[fromvc willMoveToParentViewController:nil];

[self transitionFromViewController:fromvc
                  toViewController:tovc
                          duration:0.4
                           options:UIViewAnimationOptionTransitionFlipFromLeft
                        animations:nil
                        completion:^(BOOL done){
                            // note: when we call add, we must call "did" afterwards
                            [tovc didMoveToParentViewController:self];
                            [fromvc removeFromParentViewController]; // "did" called for us
                        }];
like image 2
matt Avatar answered Oct 14 '22 16:10

matt