0

我正在尝试实现一个与按钮上的 alpha 值混淆的简单动画。但它走得太快,你看不到动画。

-(void)Flash: (id)sender {
    UIButton *senderButton = (UIButton *)sender;
    for (float i = 0.8; i > 0.2; i = i - 0.1) {
        senderButton.alpha = i;
    }
    senderButton.alpha = 0.9;
}

每0.5秒怎么能减慢进程?

4

2 回答 2

4

要在指定的持续时间内减少视图的不透明度,请将其放入动画块中。您可以设置 alpha - 我个人的偏好是为诸如此类的视觉处理调整图层属性(主要是我的代码库中的一致性问题)。您可以使用此处演示的任何一种方法(不要同时使用两者) - 在这种情况下差异可以忽略不计。如果您修改图层属性,则需要导入 Quart 标头。

- (void)flash:(id)sender
{
    UIButton *button = (UIButton *)sender;

    NSTimeInterval duration = 1;
    [UIView animateWithDuration:duration
                     animations:^{

                         // My preferred approach is to set layer opacity...
                         [[button layer] setOpacity:0.1f];

                         // But you could just as easily set alpha (per your original question)
                         [button setAlpha:0.1f];


                     } completion:^(BOOL finished) {

                         // Returns the button to full opacity on completion.
                         [[button layer] setOpacity:1.0f];

                         // Or alternately, alpha
                         [button setAlpha:1.0f];
                     }];

}
于 2012-11-16T15:09:44.900 回答
0
for (float i = 0.8; i > 0.2; i = i - 0.1) {
    senderButton.alpha = i;
}

您在这里(至少)有两个问题:

  1. 您的更改alpha速度大约是设备的六倍,这非常快。绝对不可能有人看到这种情况发生。您需要在每次更改之间添加延迟以减慢速度。

  2. 您在alpha不重绘视图的情况下更改了很多次。重绘是运行循环的一部分;当您使用这样的for循环时,您的所有更改都会同步发生,并且运行循环在每次更改后都没有机会重绘。因此,即使您添加了延迟以将动画减慢到人们可以看到的程度,人们仍然看不到它,因为您没有绘制它。

您可以使用 Core Animation 轻松解决这两个问题。以撒在他的回答中提供的例子很好。如果没有 Core Animation,您需要使用计时器来提供延迟。计时器会在每次触发时调用您的代码,以便您进行更改,并且它还允许运行循环正常运行,以便视图可以重绘。Core Animation 让这一切变得更简单——你设置动画持续时间和动画属性的最终值,例如alpha,Core Animation 会随着时间慢慢调整属性的值,直到它在动画结束时达到最终值.

于 2012-11-25T16:12:38.217 回答