我有一个 UIView 动画(由 touchesEnded:
事件调用),我想在允许更多用户输入之前完成执行。在调用动画之前,我检查了一个标志“isMoving
”以查看动画是否在进行中。然后我将 isMoving
设置为 YES
并按如下方式执行动画(是的,我知道它不是 block 格式)...
- (void) methodCalledFromViewControllerTouchesEnded {
if (isMoving == YES) {
NSLog (@"Don't start another animation!");
return;
}
isMoving = YES;
......
[UIView beginAnimations:@"move" context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:0.25f];
...
// DO MOVE STUFF
...
[UIView commitAnimations];
isMoving = NO;
}
然后我将 isMoving
设置为 NO
,这样来自 touchesEnded:
的后续调用不会在当前动画正在进行时启动另一个动画。但是,如果用户在初始动画正在进行时继续触摸,则此失败和动画会重复多次。
我想知道这是否与触摸事件在与动画不同的线程上处理的可能性有关。
我也在 Debug模式下运行并注意到在控制离开 methodCalledFromViewControllerTouchesEnded
并返回到 touchesEnded:
之前动画实际上并没有“提交”,因此呈现 isMoving = NO;
标记无用。
如果您能帮助防止重复动画,我们将不胜感激。
最佳答案
如果使用UIView的类方法
+ (void)animateWithDuration:(NSTimeInterval)duration
animations:(void (^)(void))animations
默认情况下,用户交互是禁用的,直到动画结束。它会为你节省很多工作。对你来说,你会想要使用完整的方法,这样你就可以使用你的 EaseIn 选项。看起来像这样
- (void) methodCalledFromViewControllerTouchesEnded {
[UIView animateWithDuration:0.25f
delay:0.0
options:UIViewAnimationOptionCurveEaseIn
animations:^(void){
// You animations here
}
completion: nil];
}
如果您按照目前的方式进行操作,则需要进行一些更改。请记住,动画不会阻塞,因此当您在最后将 isMoving 设置为 NO 时,这会在动画开始后立即发生,而不是在结束后发生。现在,让我重申一下,上面的代码比您的方法简单得多,但如果您确实想继续沿着您的路径前进,您将需要为动画设置 animationStopped 完成方法,并在该方法中将 isMoving 设置为 NO。它看起来像这样:
isMoving = YES;
[UIView beginAnimations:@"move" context:NULL];
//...
[UIView setAnimationDidStopSelection:@selector(animationDidStop:finished:context:)];
// ... DO MOVE STUFF
//....
[UIView commitAnimations];
然后你将像这样实现选择器:
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
isMoving = NO;
}
关于iphone - 在 UIView 动画期间阻止用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748337/