如何淡化UIView的背景色 - 的iOS 5(How to fade UIView backgro

2019-08-08 10:14发布

我有麻烦试图让一个自定义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]]; 它一直显示为红色。 但有逐渐节点白红的效果。

我已经跑出去的想法..任何帮助,将不胜感激!

Answer 1:

所以我有一个自定义的UIView,用户可以借鉴的东西。

我假设,这意味着你已经实现-drawRect:

IIRC,默认情况下(如果UIView.clearsContextBeforeDrawing设置),上下文被充满视图的背景颜色, -drawRect:被调用,并生成位图绘制在屏幕上,而不是背景色。 动画这将意味着两个位图,这是不是核心动画尤为擅长之间动画。 (我可能是错这里的细节,但它说明了其行为)。

最简单的解决方法是设置背景颜色到[UIColor clearColor]和动画您绘制到一个在后面的图的背景颜色。 这意味着该视图不会需要重绘,只是recomposited在“背景”。



Answer 2:

[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的财产申报,在你的接口或头文件。



Answer 3:

我想你的代码,因为是。 它的工作完美 - 从我的观点的原白色褪红,慢慢地(然后跳回到白色,这是你所期望)。 所以,如果这不是为你工作,别的东西是怎么回事。

一个非常有用的诊断工具是提取你的麻烦的代码,使包括没有别的项目。 我所做的是你应该做的。 做一个全新的单一视图应用程序项目。 现在你有一个视图控制器和视图。 实现这个方法:

- (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"];
}

运行该项目。 淡出完美的作品。 所以你看,无论是去错不在此代码! 这是在其他地方。 也许你有其它的代码,也做的事情色彩 - 一个不同的动画被粉碎这一个。 也许有一定的参考是不是指你认为它是。 也许事情是覆盖层,所以你看不到它(子)。 谁知道? 你没有表现出整个项目(也不应该知道)。 最重要的是要证明自己的代码应该工作,所以你可以找出什么是真的错了。 我已经展示了如何做到这一点。



文章来源: How to fade UIView background color - iOS 5