• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:48:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

[[viewController view] setUserInteractionEnabled:NO];

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

然后我尝试了:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

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

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

有什么想法吗?对于 iOS 应用中的这个问题,人们会怎么做?



Best Answer-推荐答案


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

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

@interface UIApplicaiton(AnimationsInProgress)

- (BOOL)isAnimationInProgress;
- (void)setAnimationInProgressBOOL)value;

@end

以及实现:

@implementation UIApplication(AnimationsInProgress)
{
    BOOL _isAnimationInProgress;
}

- (BOOL)isAnimationInProgress {
    return _isAnimationInProgress;
}

- (void)setAnimationInProgressBOOL)value {
    _isAnimationInProgress = value;
}

在动画操作的顶部使用它就像 beginIgnoringInteractionEvents 一样:

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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap