Search code examples
iphoneioscore-animation

Switching views using Core Animation not working?


Currently I am having a issue switching views using Core Animation. I want to fade through black switching to my next view. Right now it does not do anything besides lose touch events from my original view. What am I doing wrong in the code below?

Edit1 Code:

    - (void)changeView1ToView2 {
    CABasicAnimation *fadeout= [CABasicAnimation animationWithKeyPath:@"opacity"];
    [fadeout setDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)];
    [fadeout setToValue:[NSNumber numberWithFloat:0]];
    [fadeout setDuration:0.5];
    [[self.view layer] addAnimation:fadeout forKey:@"alpha"];
}
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    [self.view addSubview:self.view2.view];
    self.view2.view.frame = [UIScreen mainScreen].bounds;
    [self.view2.view setAlpha:0];
    CABasicAnimation *fadein = [CABasicAnimation animationWithKeyPath:@"opacity"];
    [fadein setToValue:[NSNumber numberWithFloat:1.0]];
    [fadein setDuration:0.5];
    [[self.view2.view layer] addAnimation:fadein forKey:@"alpha"];
}

Ok I added self, look at my new code above. view2 is a UIViewController, thats why I am doing .view after it. The app is only going to be available on iOS 5 or up so thats not a problem. But what I am trying to achieve is switching views using Core Animation, and have each UIViewController manage their own views. I am just switching views using Core Animation instead of usual means.


Solution

  • If you're looking to have only one root view on screen at one time (and by the looks of that call to [UIScreen mainScreen].bounds, you are), then I'd suggest swapping the views at the UIWindow level. Without animations, this would look something like this:

    // Assuming UIViewControllers called view1 and view2 as members of some
    // (non-UIViewController) controller class (self, in this case)
    //and that view1.view is in the application's window's subviews collection
    [self.view1.view removeFromSuperview];
    [[UIApplication sharedApplication].delegate.window addSubview:self.view2.view];
    

    In terms of not seeing the views actually swap, you need to ensure that your animation preserves the changes you make during the animation. Specifically, you need to set the following:

    myAnimation.fillMode = kCAFillModeForwards;
    myAnimation.removedOnCompletion = NO;
    

    Your methods can then be adjusted to take all this into account. For example, your animationDidStop:finished: method might look like this:

    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
    {
        [self.view1.view removeFromSuperview];
    
        [self.view2.view setAlpha:0];
        [[UIApplication sharedApplication].delegate.window addSubview:self.view2.view];
    
        CABasicAnimation *fadein = [CABasicAnimation animationWithKeyPath:@"opacity"];
        [fadein setToValue:[NSNumber numberWithFloat:1.0]];
        [fadein setDuration:0.5];
        fadein.fillMode = kCAFillModeForwards;
        fadein.removedOnCompletion = NO;
        [[self.view2.view layer] addAnimation:fadein forKey:@"alpha"];
    }
    

    You may need to muck around with it a bit to ensure that everything is firing correctly.