【问题标题】:Timer and animation events trumping TouchesEnded events定时器和动画事件胜过 TouchesEnded 事件
【发布时间】:2008-10-30 23:10:54
【问题描述】:

我已经使用我首先在 TouchesBegan 重载中设置的 NSTimer 实现了一个长按处理程序。

但是,我真正想要的是在按住触摸的同时连续快速执行一个动作。因此,在计时器到期时,我调用一个处理程序来完成这项工作,然后它设置另一个计时器并继续循环,直到 TouchesEnded 进入并取消它,或者满足另一个终止条件。

这工作正常,直到我的处理程序代码同时触发动画。 现在我们已经启动了动画事件和计时器事件,而且我们还需要处理 TouchesEnded。

我发现,如果触发了动画,并且我将计时器设置为小于 0.025 秒,我的 TouchesEnded 事件直到计时器周期停止(另一个终止条件)才会发生。设置一个较慢的计时器,或者不触发动画,让它工作(TouchedEnded 立即出现),但不是我想要的。

显然这一切都在设备上(发布版本 - 没有 NSLogs) - 在 sim 中一切正常

有没有办法设置这些事件的相对优先级 - 或者我可能在这里遗漏了其他明显的东西?

[更新]

在这种情况下,我通过在没有视觉反馈的情况下执行连续部分来解决这个问题,直到它完成(从这个用户的角度来看,这是即时的)。我认为目前还可以。我仍然希望听到更多关于此的想法(Jeffrey 的想法很好),但我现在不会坐立不安。

【问题讨论】:

  • 感谢您调整标签,克里斯,这可能有助于让更多人看到这个问题。

标签: iphone objective-c cocoa-touch core-animation timer


【解决方案1】:

尝试通过生成线程来编写您自己的 Timer 类型的类。示例:

BOOL continue = YES; //outside of your @implementation

-(void)doLoop
{
   while(continue){
      [NSThread sleepForTimeInterval:.025];
      [self performSelectorOnMainThread:@selector(whateverTheFunctionIs) waitUntilDone:YES];
    }
}

这将由[NSThread detatchNewThreadSelector:@selector(doLoop) toTarget:self withObject:nil] 开始。这并不完全是线程安全的,但是您可以选择将布尔值包装到 NSNumber 中,然后在您选择时对其执行 @synchronize 。或者,在我写了那个小 sn-p 之后,我意识到最好检查当前的 NSTime 而不是 sleepForTimeInterval: 但你明白了。 :)

【讨论】:

  • 谢谢杰弗里。我不确定这是否是我正在寻找的答案,但这当然值得一试,而且我可以通过这种方式对优先级进行一些控制——尽管动画仍然不是这样。暂时保持开放状态 - 但感谢您的回复(并投票支持您)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多