gpt4 book ai didi

ios - 如何确保只有一个操作运行以响应用户输入?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:44:08 27 4
gpt4 key购买 nike

假设一个应用程序有两个按钮,每个按钮启动一个动画(例如,一个推送或其他标准 segue 或自定义动画)。如果用户“同时”按下两个按钮,您如何阻止两个动画同时发生?好吧,首先我尝试了:

[[viewController view] setUserInteractionEnabled:NO];

但这并不能解决问题。 (也许 userInteractionEnabled 没有立即级联到 subview ?)

然后我尝试了:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

这确实解决了问题,除了如果您非常同时按下两个按钮,一个接一个地按下(基本上是用两根手指同时按下),然后您会同时发生这两个动画,这会导致我的应用程序出现问题。也许在调用我运行 -beginIgnoringInteractionEvents 的代码之前,这两个事件都已触发?

立即停止任何其他点击事件的可靠方法是什么?或者清除已经开始的那些。我的应用程序中到处都是这个问题 - 按下两个按钮(或点击表格单元格等)很快会触发两个事件并弄乱动画。

有什么想法吗?人们如何处理 iOS 应用中的这个问题?

最佳答案

触摸处理在 iOS 中异步完成,以确保设备响应。这意味着处理程序可能在运行之前排队,这就是为什么您对 beginIgnoringInteractionEvents 的调用被忽略的原因。

最简单的解决方案是简单地创建一个全局变量,使交互独占您自己。

@interface UIApplicaiton(AnimationsInProgress)

- (BOOL)isAnimationInProgress;
- (void)setAnimationInProgress:(BOOL)value;

@end

和实现:

@implementation UIApplication(AnimationsInProgress)
{
BOOL _isAnimationInProgress;
}

- (BOOL)isAnimationInProgress {
return _isAnimationInProgress;
}

- (void)setAnimationInProgress:(BOOL)value {
_isAnimationInProgress = value;
}

几乎可以像使用 beginIgnoringInteractionEvents 一样使用它,在动画 Action 的顶部:

if ([[UIApplication sharedApplication] isAnimationInProgress)
return;
[[UIApplication sharedApplication] setAnimationInProgress:YES];

[UIView animate .... completion:^{
[[UIApplication sharedApplication] setAnimationInProgress:NO];
}];

由于不存在像触摸事件和 beginIgnoringInteractionEvents 那样的竞争条件,因此这将适用于您的目的。

关于ios - 如何确保只有一个操作运行以响应用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15615719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com