Iphone 使用核心动画切换视图不起作用?
目前,我在使用核心动画切换视图时遇到了一个问题。我想通过黑色渐变切换到下一个视图。 从我最初的观点来看,现在除了失去联系之外,它什么也做不了。 我在下面的代码中做错了什么 Edit1代码:Iphone 使用核心动画切换视图不起作用?,iphone,ios,core-animation,Iphone,Ios,Core Animation,目前,我在使用核心动画切换视图时遇到了一个问题。我想通过黑色渐变切换到下一个视图。 从我最初的观点来看,现在除了失去联系之外,它什么也做不了。 我在下面的代码中做错了什么 Edit1代码: - (void)changeView1ToView2 { CABasicAnimation *fadeout= [CABasicAnimation animationWithKeyPath:@"opacity"]; [fadeout setDelegate:self]; [UI
- (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"];
}
好的,我添加了self,看看上面我的新代码。view2是一个UIViewController,这就是为什么我要这么做。在它之后查看。该应用程序将仅在iOS 5或更高版本上可用,因此这不是问题。但我试图实现的是使用核心动画切换视图,并让每个UIViewController管理自己的视图。我只是用核心动画而不是通常的方式来切换视图。如果您希望一次屏幕上只有一个根视图(并且通过调用
[UIScreen mainScreen].bounds
,您可以),那么我建议在UIWindow
级别上交换视图。如果没有动画,这看起来像这样:
// 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];
- (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"];
}
就看不到视图实际交换而言,需要确保动画保留在动画期间所做的更改。具体而言,您需要设置以下各项:
myAnimation.fillMode = kCAFillModeForwards;
myAnimation.removedOnCompletion = NO;
然后可以调整您的方法以考虑所有这些因素。例如,您的animationDidStop:finished:
方法可能如下所示:
// 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];
- (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"];
}
您可能需要对它进行一些修改,以确保所有操作都正确启动。如果您希望一次屏幕上只有一个根视图(并且通过调用
[UIScreen mainScreen].bounds
,您可以),那么我建议在UIWindow
级别交换视图。如果没有动画,这看起来像这样:
// 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];
- (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"];
}
就看不到视图实际交换而言,需要确保动画保留在动画期间所做的更改。具体而言,您需要设置以下各项:
myAnimation.fillMode = kCAFillModeForwards;
myAnimation.removedOnCompletion = NO;
然后可以调整您的方法以考虑所有这些因素。例如,您的animationDidStop:finished:
方法可能如下所示:
// 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];
- (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"];
}
您可能需要稍微处理一下,以确保一切正常。在这种情况下,
view2
是self
的成员吗?它应该是属性吗,alaself.view2
…?这可能与您的问题无关,但如果您有此成员的属性,则应尽可能使用访问器-(void)dealloc
和任何init
方法都是例外。此外,我假设view2
实际上是UIViewController
子类?根据语法,看起来是这样的。如果您的目标是iOS4或更早版本,那么让多个视图控制器共享同一个UIView
不是一个好主意。在iOS5下,您可以让多个视图控制器共享视图层次结构的一部分,但是您应该使用self
上的视图控制器容器方法来添加它们,假设self
也是UIViewController
。明白了-谢谢,这更清楚了。我在下面添加了一个可能会有所帮助的答案。如果我需要澄清,请告诉我!在这种情况下,view2
是self
的成员吗?它应该是属性吗,alaself.view2
…?这可能与您的问题无关,但如果您有此成员的属性,则应尽可能使用访问器-(void)dealloc
和任何init
方法都是例外。此外,我假设view2
实际上是UIViewController
子类?根据语法,看起来是这样的。如果您的目标是iOS4或更早版本,那么让多个视图控制器共享同一个UIView
不是一个好主意。在iOS5下,您可以让多个视图控制器共享视图层次结构的一部分,但是您应该使用self
上的视图控制器容器方法来添加它们,假设self
也是UIViewController
。明白了-谢谢,这更清楚了。我在下面添加了一个可能会有所帮助的答案。如果我需要澄清,请告诉我!我真的不想在UIWindow级别切换视图。我想保持在正常水平。我还想淡出视图1,然后将视图更改为视图,然后从0的alpha淡入。我真的不想在UIWindow级别切换视图。我想保持在正常水平。我还想淡出视图1,然后将视图更改为view,然后从0的alpha淡入。