在xcode中延迟命令

时间:2012-11-16 15:02:42

标签: objective-c ios cocoa-touch button alpha

我正在尝试使用按钮上的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秒减慢一次过程?

2 个答案:

答案 0 :(得分:4)

要在指定的持续时间内减少视图的不透明度,请将其投放到动画块中。您可以设置alpha - 我的个人偏好是调整视觉处理的图层属性,例如这(主要是我的代码库中的一致性问题)。您可以使用此处演示的EITHER方法(不要同时使用两者) - 在这种情况下,差异可以忽略不计。如果修改了图层属性,则需要导入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];
                     }];

}

答案 1 :(得分:0)

for (float i = 0.8; i > 0.2; i = i - 0.1) {
    senderButton.alpha = i;
}

这里至少有两个问题:

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

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

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