我想在UILabel
上执行一系列动画,因此我查找了iOS7中添加的UIViewKeyframeAnimations
。
我想要做的简化版本是:
使用持续时间为0.5秒的新文本淡入UILabel
NSTimeInterval duration = 2;
[UIView animateKeyframesWithDuration:duration delay:0 options:UIViewKeyframeAnimationOptionAllowUserInteraction | UIViewAnimationOptionOverrideInheritedOptions animations:^{
[UIView addKeyframeWithRelativeStartTime:0 relativeDuration:0.5/duration animations:^{
self.label.alpha = 0;
}];
[UIView addKeyframeWithRelativeStartTime:1.5/duration relativeDuration:0.5/duration animations:^{
self.label.text = [@(arc4random_uniform(4000)) stringValue];
self.label.alpha = 1;
}];
} completion:nil];
结果是标签文本淡出并重新显示新文本,然后再次淡出并再次淡入。
结果视频:Animation Failure
干杯 的Morten
答案 0 :(得分:1)
您声明:“结果是标签文字淡出并重新显示新文本,然后再次淡出并再次淡入。”。然而,我在电影中看到的是,alpha转换只是按预期工作,淡出和淡入。你想要的行为的唯一例外是文本更改已经在动画开始时应用,而不是在动画的第二个关键帧的开头。
了解一旦调用animateKeyframesWithDuration,addKeyframeWithRelativeStartTime块中的代码就会被执行,这一点很重要。任何可动画的变化(帧,alpha等)都将被动画化。同样,任何不是自动动画视图属性的内容(例如标签的文本更改)都会立即显示。
为了帮助说明这一点,请尝试在所有动画块(animateKeyframesWithDuration和addKeyframeWithRelativeStartTime)的开头放置一个NSLog语句,并在完成块中放置一个。您将看到完成块中的每个NSLog (除外)具有完全相同的日志时间。
由于这个原因,下面的代码将工作,因为整个块的执行被推迟到第一个动画结束:
[UIView animateWithDuration:1 animations:^{
self.label.alpha = 0;
} completion:^(BOOL finished) {
self.label.text = [@(arc4random_uniform(4000)) stringValue];
[UIView animateWithDuration:1 animations:^{
self.label.alpha = 1;
}];
}];
答案 1 :(得分:0)
以下是我要做的事情:不使用关键帧来制作像这样的简单动画,我会使用带动画的动画:
[UIView animateWithDuration:0.25 animations:^
{
[self.label setAlpha:0.0];
[self.imageview setAlpha:0.0];
}
completion: ^(BOOL completed)
{
[UIView animateWithDuration:0.25 delay:0.5 options:UIViewAnimationOptionAllowUserInteraction animations:^
{
self.label.text = [@(arc4random_uniform(4000)) stringValue];
[self.label setAlpha:1.0];
}
completion: ^(BOOL completed)
{
}
];
[UIView animateWithDuration:1.0 delay:0.5 options:UIViewAnimationOptionAllowUserInteraction animations:^
{
[self.imageview setAlpha:1.0];
[self.imageview setFrame:frame];
}
completion: ^(BOOL completed)
{
//if you need to do stuff after the animations finish, here you can do them.
}
];
}
];