在UIView动画期间阻止用户输入

Old*_*her 0 iphone cocoa-touch uiviewanimation ios

我有一个UIView动画(由touchesEnded:事件调用),我希望在允许更多用户输入之前完成执行.在调用动画之前,我检查标志" isMoving"以查看动画是否正在进行中.然后我设置isMovingYES并执行如下动画(是的,我知道这是不是块格式)...

- (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;
}
Run Code Online (Sandbox Code Playgroud)

然后我设置isMovingNO所以后续调用touchesEnded:不会启动另一个动画,而当前的动画正在进行中.然而,如果用户在初始动画正在进行时保持触摸,则该FAILS和动画被重复进行.

我想知道这是否可能与触摸事件是在与动画不同的线程上处理的可能性.

我也在调试模式下运行并注意到动画实际上并没有被"提交",直到控件离开methodCalledFromViewControllerTouchesEnded并返回touchesEnded:,从而使得isMoving = NO;标志无用.

任何有助于防止重复动画的帮助都将非常感激.

Chr*_*ian 6

如果你使用UIView的类方法

+ (void)animateWithDuration:(NSTimeInterval)duration 
                 animations:(void (^)(void))animations
Run Code Online (Sandbox Code Playgroud)

默认情况下禁用用户交互,直到动画结束.它会为你节省很多工作.对于您,您需要使用完整方法,以便可以使用EaseIn选项.它看起来像这样

- (void) methodCalledFromViewControllerTouchesEnded {

        [UIView animateWithDuration:0.25f 
                              delay:0.0 
                            options:UIViewAnimationOptionCurveEaseIn 
                         animations:^(void){
                                     // You animations here
                         } 
                         completion: nil];

}
Run Code Online (Sandbox Code Playgroud)

如果按照目前的方式进行,则需要更改一些内容.请记住,动画没有阻塞,因此当你在最后将isMoving设置为NO时,动画开始后立即发生,而不是在结束后发生.现在,让我重申上面的代码比你的方法简单得多,但是如果你想继续沿着你的路径继续下去,你需要为你的动画设置animationStopped完成方法,并且在那个方法中,将isMoving设置为NO.它看起来像这样:

isMoving = YES;
[UIView beginAnimations:@"move" context:NULL];
//...
[UIView setAnimationDidStopSelection:@selector(animationDidStop:finished:context:)];
// ... DO MOVE STUFF
//....
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

然后你会像这样实现选择器:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
     isMoving = NO;
}
Run Code Online (Sandbox Code Playgroud)


pek*_*eko 5

我遇到了类似的问题,解决了以下问题:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
[[UIApplication sharedApplication] endIgnoringInteractionEvents];
Run Code Online (Sandbox Code Playgroud)