Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用核心动画切换视图不起作用?_Iphone_Ios_Core Animation - Fatal编程技术网

Iphone 使用核心动画切换视图不起作用?

Iphone 使用核心动画切换视图不起作用?,iphone,ios,core-animation,Iphone,Ios,Core Animation,目前,我在使用核心动画切换视图时遇到了一个问题。我想通过黑色渐变切换到下一个视图。 从我最初的观点来看,现在除了失去联系之外,它什么也做不了。 我在下面的代码中做错了什么 Edit1代码: - (void)changeView1ToView2 { CABasicAnimation *fadeout= [CABasicAnimation animationWithKeyPath:@"opacity"]; [fadeout setDelegate:self]; [UI

目前,我在使用核心动画切换视图时遇到了一个问题。我想通过黑色渐变切换到下一个视图。 从我最初的观点来看,现在除了失去联系之外,它什么也做不了。 我在下面的代码中做错了什么

Edit1代码:

    - (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
的成员吗?它应该是属性吗,ala
self.view2
…?这可能与您的问题无关,但如果您有此成员的属性,则应尽可能使用访问器
-(void)dealloc
和任何
init
方法都是例外。此外,我假设
view2
实际上是
UIViewController
子类?根据语法,看起来是这样的。如果您的目标是iOS4或更早版本,那么让多个视图控制器共享同一个
UIView
不是一个好主意。在iOS5下,您可以让多个视图控制器共享视图层次结构的一部分,但是您应该使用
self
上的视图控制器容器方法来添加它们,假设
self
也是
UIViewController
。明白了-谢谢,这更清楚了。我在下面添加了一个可能会有所帮助的答案。如果我需要澄清,请告诉我!在这种情况下,
view2
self
的成员吗?它应该是属性吗,ala
self.view2
…?这可能与您的问题无关,但如果您有此成员的属性,则应尽可能使用访问器
-(void)dealloc
和任何
init
方法都是例外。此外,我假设
view2
实际上是
UIViewController
子类?根据语法,看起来是这样的。如果您的目标是iOS4或更早版本,那么让多个视图控制器共享同一个
UIView
不是一个好主意。在iOS5下,您可以让多个视图控制器共享视图层次结构的一部分,但是您应该使用
self
上的视图控制器容器方法来添加它们,假设
self
也是
UIViewController
。明白了-谢谢,这更清楚了。我在下面添加了一个可能会有所帮助的答案。如果我需要澄清,请告诉我!我真的不想在UIWindow级别切换视图。我想保持在正常水平。我还想淡出视图1,然后将视图更改为视图,然后从0的alpha淡入。我真的不想在UIWindow级别切换视图。我想保持在正常水平。我还想淡出视图1,然后将视图更改为view,然后从0的alpha淡入。