当手势识别器点击主视图为视图设置动画时:
-(void) doAnimate {
[UIView animateWithDuration:3
animations:^{
self.circleView.center = CGPointMake(100, 300);
}
completion:^(BOOL finished) {
NSLog(@"finished is %i", finished);
[UIView animateWithDuration:1 animations:^{
self.circleView.center = CGPointMake(250, 300);
}];
}
];
}
(有链式动画)。如果它是动画并再次点击主视图,我实际上看到两次调用完成处理程序,第一次使用TRUE,第二次使用FALSE。我以为它只被叫一次,假的?我在Apple's doc找不到它。如果动画已经开始动画,它是否有一个规则如何工作? (我认为应用它是同样的视图再次动画,并且如果view2动画而view1是动画的,则不适用?)
更新:以下代码可以显示更多信息:
-(void) dropAnimate:(UIGestureRecognizer *) g {
int n = arc4random() % 10000;
int y = 501 + arc4random() % 200;
NSLog(@"y is %i", y);
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, y, 10, 10)];
label.text = @"x";
[self.view addSubview:label];
[UIView animateWithDuration:3
animations:^{
NSLog(@"n is %i", n);
self.circleView.center = CGPointMake(100, y);
}
completion:^(BOOL finished) {
NSLog(@"n is %i", n);
NSLog(@"finished is %i y is %i", finished, y);
[UIView animateWithDuration:3 animations:^{
self.circleView.center = CGPointMake(250, y);
}
];
}
];
NSLog(@"finished the method call");
}
除了@Kai在下面的答案之外,似乎在已经有动画进行时,同一个UIView对象的新动画有一个规则:旧动画将立即完成其效果,并运行新动画,然后接下来使用completion
调用旧动画的NO
,现在启动第3个动画,这会导致动画2完成效果,但接下来调用其completion
块,使用NO
,它会使动画3立即生效...我们看到动画4运行3秒钟。
可以尝试上面的示例代码...并且为了简化它,只需删除completion
块,然后尝试它,并确认规则:如果我们在上面开始一个新的动画同一个对象,旧动画立即生效,新动画运行...
使用completion
块,如果completion
块启动另一个动画,它会变得非常复杂......
所以我认为最后一件事是:是否有任何文档或规范指明了这种行为?
答案 0 :(得分:1)
我认为会发生以下情况:
您的第一个触发器将center
设置为(100,300)
,然后为视图设置动画(请注意center property
在实际看到之前发生了变化!)。您的第二个触发器立即返回(使用completion
调用YES
),因为没有任何动画(该属性之前已经设置为相同的值)并重置center
并由此强制第一个动画(仍然在运行)以NO停止,因为circleview
通过获取新的center
从它的动画中消失了(注意第二个触发器在调用之前不会打扰第一个动画) completion
,因为circleview
的{{1}}未更改。