UIView动画被调用两次,取消动画

时间:2015-07-19 03:13:42

标签: ios cocoa-touch animation uiview uiviewanimation

我有一个UIView动画,从左侧将UIView带到屏幕上,该方法从条形码扫描引擎快速连续触发,触发该方法然后再次触发,使其从屏幕。

-(IBAction)showDetailModeView
{
    if (detailModeViewON==FALSE)
    {
        [UIView beginAnimations:@"move buttons" context:nil];
        [UIView setAnimationDuration:.3];
        [detailModeView setFrame:CGRectMake(0, 0, 320, 568)];
        [UIView commitAnimations];

        detailModeViewON=TRUE;
    }
    else
    {
        [UIView beginAnimations:@"move buttons" context:nil];
        [UIView setAnimationDuration:.3];
        [detailModeView setFrame:CGRectMake(-320, 0, 320, 568)];
        [UIView commitAnimations];

        [self stopScanning];
        scannedONCE = FALSE;
        detailModeViewON=FALSE;
    }
    [self.view endEditing:YES];
}

有什么方法我基本上可以说这个方法是否在最后5秒内被调用,不做任何事情。

伪代码

-(IBAction)showDetailModeView
{

if(UIVIEW animation was triggered longer than 5 seconds ago)
{ 
    if (detailModeViewON==FALSE)
    {
        [UIView beginAnimations:@"move buttons" context:nil];
        [UIView setAnimationDuration:.3];
        [detailModeView setFrame:CGRectMake(0, 0, 320, 568)];
        [UIView commitAnimations];

        detailModeViewON=TRUE;
    }
    else
    {
        [UIView beginAnimations:@"move buttons" context:nil];
        [UIView setAnimationDuration:.3];
        [detailModeView setFrame:CGRectMake(-320, 0, 320, 568)];
        [UIView commitAnimations];

        [self stopScanning];
        scannedONCE = FALSE;
        detailModeViewON=FALSE;
    }
    [self.view endEditing:YES];
}
}

1 个答案:

答案 0 :(得分:1)

编辑添加您应该使用基于块的动画,例如;

 [UIView animateWithDuration:(NSTimeInterval)duration
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion];

你可以在这里找到很多这方面的例子。

很多时候你需要在发生转变时不允许过渡。例如,将gesture.enabled设置为NO,并在动画的完成块中返回YES,或者使用在动画开始之前设置为NO的布尔值,并在完成块中将其设置为YES。然后在调用动画之前检查一下该布尔值是什么。

这些事情在UI实现中非常常见。否则你最终可能会遇到很多次攻击。