【问题标题】:iOS - Random animation color [closed]iOS - 随机动画颜色 [关闭]
【发布时间】:2013-03-23 17:17:10
【问题描述】:

我正在为一些子视图制作动画,动画的步骤之一是更改视图背景颜色。但是,尽管我有一个返回随机颜色的函数,但一旦设置了背景颜色,在动画定义期间,它就不会再次调用我的函数来获取另一种颜色。

有什么方法可以强制动画在每次执行动画时调用我的函数?


片段:

for (UIView* subView in self.view.subviews) {
    dispatch_async(dispatch_get_main_queue(), ^{
                    [UIView animateWithDuration:1.0f
                          delay:0.0f
                        options: UIViewAnimationOptionRepeat
                     animations:^{
                         subView.backgroundColor = getRandomColor();
                     }
                     completion:nil];
                     });
}

【问题讨论】:

  • 你能告诉我们你正在尝试的代码吗?
  • 问题是,一旦为动画设置了颜色,当它重复动画时,它就不会再次调用我的函数来获取另一种颜色。我希望每次动画重复时,它都会以不同的颜色重复。
  • 您可以尝试将 getRandomColor() 的输出分配到 UIView 动画块外的 UIColor 变量中,然后将背景颜色设置为动画块内的该变量吗?
  • 据此:stackoverflow.com/questions/3762561/… - 尝试使用 subview.layer 而不是 subview。如果 GCD 没有犯规,它似乎是这样工作的。
  • 它还没有工作,甚至动画层而不是 UIView 本身。

标签: ios objective-c animation uiview


【解决方案1】:

getRandomColor(); 只会被调用一次,subView 将每 1 秒将其背景颜色设置为该颜色(因此它会根据您的原始背景颜色设置动画,然后每 1 秒设置为相同颜色) .

你需要做的就是把这个放到一个方法中,去掉UIViewAnimationOptionRepeat,在再次调用该方法的UIView动画中添加一个完成块。

【讨论】:

  • 但是去掉重复的选项,是否还能以某种方式制作连续动画?
  • @MauricioZambon 是的,使用递归函数或相互依赖的块。
  • 像魅力一样工作。将动画块放在函数中,然后在 completion 块中重新调用它可以解决问题。
【解决方案2】:

如果您只想切换背景颜色,这里有另一种方法:

  • 不需要for循环
  • 不需要做dispatch_async

    NSArray *animationImages = [[NSArray alloc] initWithObjects:
    [UIImage imageNamed:@"image1.png"],    
    [UIImage imageNamed:@"image2.png"],
        ....
    [UIImage imageNamed:@"imagen.png"], nil];
    
    self.imageView.animationImages=animationImages;
    self.imageView.animationDuration=1.0;  //set duration
    [self.imageView startAnimating];
    

每个 image1..imageN.png 由您想要的颜色组成,imageView 是背景颜色的占位符视图。

免责声明: 可能有更好的解决方案可用 backgroundcolor 作为动画属性本身。这只是为了让您免于对 GCD 的未知数,以防您在不知道为什么以这种方式使用它的情况下使用它。

【讨论】:

  • 这是一个糟糕的解决方案。您不使用图像进行着色,只是没有。
  • 解决方案的好坏视需要而定。“您不使用”- 声明性声明。 “你就是不用勺子挖粉底”怎么样?经典完美的事物并不总是一个好的解决方案。不总是,是的。此外,声明性陈述不会为进一步的答案增加任何质量。如果可以的话,请给我一些非常好的东西,我全心全意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2015-05-05
  • 2017-10-06
相关资源
最近更新 更多