我有麻烦试图让一个自定义UIView类褪色它的背景。 我已经签出了以下StackOverflow的问题,但他们似乎并没有为我工作。
从一种颜色渐变背景色到另外一个的UIView
你如何明确动画一个的CALayer的的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]];
它一直显示为红色。 但有逐渐节点白红的效果。
我已经跑出去的想法..任何帮助,将不胜感激!
所以我有一个自定义的UIView,用户可以借鉴的东西。
我假设,这意味着你已经实现-drawRect:
IIRC,默认情况下(如果UIView.clearsContextBeforeDrawing
设置),上下文被充满视图的背景颜色, -drawRect:
被调用,并生成位图绘制在屏幕上,而不是背景色。 动画这将意味着两个位图,这是不是核心动画尤为擅长之间动画。 (我可能是错这里的细节,但它说明了其行为)。
最简单的解决方法是设置背景颜色到[UIColor clearColor]
和动画您绘制到一个在后面的图的背景颜色。 这意味着该视图不会需要重绘,只是recomposited在“背景”。
[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的财产申报,在你的接口或头文件。
我想你的代码,因为是。 它的工作完美 - 从我的观点的原白色褪红,慢慢地(然后跳回到白色,这是你所期望)。 所以,如果这不是为你工作,别的东西是怎么回事。
一个非常有用的诊断工具是提取你的麻烦的代码,使包括没有别的项目。 我所做的是你应该做的。 做一个全新的单一视图应用程序项目。 现在你有一个视图控制器和视图。 实现这个方法:
- (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"];
}
运行该项目。 淡出完美的作品。 所以你看,无论是去错不在此代码! 这是在其他地方。 也许你有其它的代码,也做的事情色彩 - 一个不同的动画被粉碎这一个。 也许有一定的参考是不是指你认为它是。 也许事情是覆盖层,所以你看不到它(子)。 谁知道? 你没有表现出整个项目(也不应该知道)。 最重要的是要证明自己的代码应该工作,所以你可以找出什么是真的错了。 我已经展示了如何做到这一点。