UIView 动画被调用两次,取消了动画
UIView animation being called twice, canceling out the animation
我有一个 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];
}
}
编辑添加您应该使用基于块的动画,例如;
[UIView animateWithDuration:(NSTimeInterval)duration
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion];
你可以在这里找到很多这样的例子。
很多时候您需要在发生转换时禁止转换。例如,将 gesture.enabled 设置为 NO,然后在动画的完成块中返回 YES,或者使用在动画开始之前设置为 NO 的布尔值,然后在完成块中将其设置回 YES。然后在调用动画之前检查布尔值是什么。
这类事情在 UI 实施中很常见。否则,您最终可能会像您所经历的那样多次触发。
我有一个 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];
}
}
编辑添加您应该使用基于块的动画,例如;
[UIView animateWithDuration:(NSTimeInterval)duration
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion];
你可以在这里找到很多这样的例子。
很多时候您需要在发生转换时禁止转换。例如,将 gesture.enabled 设置为 NO,然后在动画的完成块中返回 YES,或者使用在动画开始之前设置为 NO 的布尔值,然后在完成块中将其设置回 YES。然后在调用动画之前检查布尔值是什么。
这类事情在 UI 实施中很常见。否则,您最终可能会像您所经历的那样多次触发。