简体   繁体   中英

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM