我在尝试让一个自定义的UIView类淡出它的背景时遇到了麻烦。我已经检查了以下StackOverflow问题,但它们似乎对我不起作用。
Fade background-color from one color to another in a UIView
How do you explicitly animate a CALayer's backgroundColor?
因此,我有一个自定义的UIView,用户可以在其中绘制东西。如果他们画的是不正确的,我想使背景颜色褪色为红色,然后再回到白色。
我在自定义UIView中有一个自定义方法,称为
- (void)indicateMistake;
当我调用该方法时,我希望它执行背景色动画,因此我在该方法中包含以下内容:
CABasicAnimation* fade = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
fade.fromValue = (id)[UIColor whiteColor].CGColor;
fade.toValue = (id)[UIColor redColor].CGColor;
[fade setDuration:3];
[self.layer addAnimation:fade forKey:@"fadeAnimation"];
但是当我这样做的时候,似乎什么都没有发生。
因此,我尝试了一个愚蠢的旋转动画,看看它是否有效:
CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rotate.toValue = [NSNumber numberWithInt:M_PI];
[rotate setDuration:1];
[self.layer addAnimation:rotate forKey:@"rotateAnimation"];
由于某些原因,这会起作用,并且自定义UIView会旋转。
然后阅读了更多的StackOverflow答案,我尝试了一下:
[UIView animateWithDuration:3 animations:^{
[self setBackgroundColor: [UIColor redColor]];
} completion:^(BOOL finished) {
[self setBackgroundColor: [UIColor whiteColor]];
}];
这会立即将颜色从红色更改为白色。有时它太快了,有时我看不到它的发生。如果我注释掉[self setBackgroundColor: [UIColor whiteColor]];
,它将保持红色。但有节点渐变白色到红色的效果。
我已经没有主意了..。任何帮助都将不胜感激!
发布于 2013-01-27 09:25:04
,所以我有一个自定义的UIView,用户可以在其中绘制东西。
我假设这意味着您已经实现了-drawRect:
。
IIRC,默认情况下(如果设置了UIView.clearsContextBeforeDrawing
),使用视图的背景色填充上下文,调用-drawRect:
,并在屏幕上绘制结果位图而不是背景色。动画将意味着在两个位图之间进行动画,这并不是Core Animation特别擅长的。(我可能对这里的细节有误,但它解释了这种行为)。
最简单的解决方法是将背景颜色设置为[UIColor clearColor]
,并在您要绘制的视图后面设置背景颜色的动画。这意味着视图不需要重新绘制,只需在“背景”上重新组合即可。
发布于 2013-01-27 08:51:55
[UIView animateWithDuration:0.3f animations:^{
fade.layer.backgroundColor = [UIColor redColor].CGColor;
}
这假设你已经预先将淡入淡出视图设置为你想要的白色。
动画的最后一次尝试跳回白色的原因是因为在animateWithDuration的完成子句中,您将视图设置回白色。
完成子句在动画结束时执行,因此动画(白色-红色)发生,然后编译器继续完成,并将淡入淡出视图跳回白色。
作为额外奖励的:
我相信你可能想知道怎样才能回到白色。
好吧,让我们假设按下一个UIButton
调用这个名为"animateColors“的函数。因此,简单地实现BOOL就可以了。
- (void)animateColors {
if (!isRed) {
[UIView animateWithDuration:0.3f animations:^{
fade.layer.backgroundColor = [UIColor redColor].CGColor;
}];
isRed = YES;
} else if (isRed) {
[UIView animateWithDuration:0.3f animations:^{
fade.layer.backgroundColor = [UIColor whiteColor].CGColor;
}];
isRed = NO;
}
}
显然,您需要在接口或头文件中声明布尔值isRed的属性。
发布于 2013-01-27 09:21:29
我按原样测试了你的代码。它工作得很完美-它从我的视图中最初的白色慢慢地褪色为红色(然后又跳回白色,这是你所期望的)。所以,如果这对你不起作用,那一定有别的原因。
一个非常有用的诊断工具是提取麻烦的代码,并创建一个不包含任何其他内容的项目。我所做的就是你应该做的。创建一个全新的单视图应用程序项目。现在您有了一个视图控制器及其视图。实现此方法:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
CABasicAnimation* fade = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
fade.fromValue = (id)[UIColor whiteColor].CGColor;
fade.toValue = (id)[UIColor redColor].CGColor;
[fade setDuration:3];
[self.view.layer addAnimation:fade forKey:@"fadeAnimation"];
}
运行项目。淡入淡出效果非常好。所以你看,不管是什么问题都不在这段代码中!它在别的地方。也许你有其他代码也在对颜色做一些事情-一个不同的动画正在破坏这个动画。也许某些引用并不是指您所认为的内容。也许有什么东西覆盖了这一层,所以你看不到它(子层)。谁知道呢?你没有展示你的整个项目(你也不应该)。重要的是向自己证明代码应该可以工作,这样你才能找出真正的错误所在。我已经向你展示了如何做到这一点。
https://stackoverflow.com/questions/14543266
复制相似问题