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

标签 iphone cocoa-touch ios uiviewanimation

我有一个 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/

相关文章:

ios - Xcode - 如何修复 'NSUnknownKeyException' ,原因 : … this class is not key value coding-compliant for the key X"error?

java - 适用于 Android 和 iPhone 的问卷

ios - 如何在 info.plist 文件 xcode ios 中使用 Code 值

ios - UIPopoverController - 如何指向 UICollectionView 单元格的自定义附件图标上的位置?

iphone - 在 UITableViewCell 中对自定义 UIButton 进行动画处理

iphone - 以编程方式在主屏幕上启动网络应用程序?

objective-c - iOS 从 applicationDidFinishLaunching 升级到 didFinishLaunchingWithOptions

iphone - 使用 UIImageView 和 CGAffinetransform 绘制的重复图层

iphone - 对于复制 NSString,我是否需要显式保留副本

objective-c - DST 的时区问题(神秘的缺失两个小时)