这个简单的问题只是为了说明一点,我的具体代码要复杂得多。
假设我的UILabel位于TOP LEFT的位置 使用此代码,我将把它移到TOP RIGHT:
// labelMove is moved to TOP RIGHT
[UIView animateWithDuration:1.0f
delay:2.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^
{
labelMove.center = CGPointMake(250.0f, 40.0f);
}
completion:nil];
如果我有这段代码:
// labelMove is moved to TOP RIGHT
[UIView animateWithDuration:1.0f
delay:2.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^
{
labelMove.center = CGPointMake(250.0f, 40.0f);
}
completion:nil];
// labelMove is moved to BOTTOM RIGHT
[UIView animateWithDuration:1.0f
delay:2.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^
{
labelMove.center = CGPointMake(250.0f, 450.0f);
}
completion:nil];
它不会从TOP LEFT开始,而是从TOP RIGHT开始,然后去BOTTOM RIGHT
不知何故,第一个动画不是动画,只是最后一个动画
我不明白为什么,但那不是那么重要
我可以把第二个完成:首先阻止然后它会起作用。
喜欢这段代码。
// labelMove is moved to TOP RIGHT
[UIView animateWithDuration:1.0f
delay:2.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^
{
labelMove.center = CGPointMake(250.0f, 40.0f);
}
completion:^(BOOL finished){
// labelMove is moved to BOTTOM RIGHT
[UIView animateWithDuration:1.0f
delay:2.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^
{
labelMove.center = CGPointMake(250.0f, 450.0f);
}
completion:nil];
}];
问题
是否可以从最后一个代码生效,但不以任何方式使用完成块
这对我来说非常重要
我尝试使用CABasicAnimation,但是不能这样做,也许有经验丰富的人可以吗?
我确信必须有某种方式,但我无法弄明白。
答案 0 :(得分:1)
您可以使用CAKeyframeAnimation,并使用这两个点创建路径。
以下是苹果的一些例子:
答案 1 :(得分:1)
没有完成块的代码不起作用,因为您试图在完全相同的时间点将标签设置为两个不同的位置。这实际上是不可能的。
当您在完成块中运行第二个动画时,您在第一个动画之后运行它,而不是同时。要获得相同的效果,请调度第二个动画,以便在第一个动画之后执行。由于第一个动画需要2.0延迟+ 1.0持续时间= 3.0秒才能完成,在3.0秒后发送。见下文。
// labelMove is moved to TOP RIGHT
[UIView animateWithDuration:1.0f
delay:2.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^
{
labelMove.center = CGPointMake(250.0f, 40.0f);
}
completion:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// labelMove is moved to BOTTOM RIGHT
[UIView animateWithDuration:1.0f
delay:2.0f
options:UIViewAnimationOptionCurveEaseOut
animations:^
{
labelMove.center = CGPointMake(250.0f, 450.0f);
}
completion:nil];
});
请注意,如果不使用完成块,则无法确保第一个动画真正完成动画。在实践中,这通常应该没问题。