我正在尝试使用按钮上的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秒减慢一次过程?
答案 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;
}
这里至少有两个问题:
您正在更改alpha
的速度是设备的六倍,而真的快。绝对没有人能够看到这种情况发生。您需要在每次更改之间添加延迟以减慢速度。
您在不重绘视图的情况下多次更改alpha
。重绘是作为运行循环的一部分发生的;当您使用这样的for
循环时,所有更改都会同步发生,并且运行循环永远不会有机会在每次更改后重绘。因此,即使您添加延迟以将动画减慢到人们可以看到它的位置,人们仍然也不会看到它,因为您没有绘制它。
您可以使用Core Animation轻松解决这两个问题。 isaac在他的回答中提供的例子很好。如果没有Core Animation,您需要使用计时器来提供延迟。计时器会在每次触发时调用您的代码,以便您可以进行更改,并且还允许运行循环正常运行,以便视图可以重绘。核心动画使得更简单 - 你设置动画持续时间和动画属性的最终值,如alpha
,核心动画负责随着时间的推移缓慢调整属性的值,直到达到最终值为止动画结束。