iOS5 上的 UIGestureRecognizerDelegate 和手势

Posted

技术标签:

【中文标题】iOS5 上的 UIGestureRecognizerDelegate 和手势【英文标题】:UIGestureRecognizerDelegate and gestures on iOS5 【发布时间】:2013-05-13 13:41:54 【问题描述】:

我在 ios5 上遇到了一个非常奇怪的手势问题。我有一个继承自 UIControl 的类。我实现了两个 GestureRecognizer:UITapGestureRecognizer 和 UILongPressGestureRecognizer。此类的对象应该是可拖动的,但只能在下载后进行。此外,当用户停止持有对象时,它应该回到原来的位置。

点击手势后,对象应该开始下载:

- (void) handleTapGestureRecognizer:(UITapGestureRecognizer*)recognizer

   [self loadingFiles:recognizer];

长按手势用于拖动对象,但放置对象后应返回其中心。

所以,我已经像这样实现了 UIGestureRecognizerDelegate:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
  shouldRecognizeSimultaneouslyWithGestureRecognizer:
  (UIGestureRecognizer *)otherGestureRecognizer

    return YES;


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

   if([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
   
     [self loadingFiles:gestureRecognizer];
     return self.isLoaded;
   
   else return YES;

在 UIGestureRecognizerDelegate 协议参考中写到“gestureRecognizerShouldBegin”在 iOS 3.2 及更高版本中可用,但是当我在 Xcode 中使用 ALT 时,还有另一个信息表明它仅在 iOS6 及更高版本中可用,为什么? iOS5 中不调用该方法。 所以在 handleLongPressGestureRecognizer 的开头我写道:

- (void)handleLongPressGestureRecognizer: (UILongPressGestureRecognizer *)recognizer

   if (!self.isLoaded)
  
     [self loadingFiles:recognizer];
     return;
  
  else 
 
     (...)
 

在 iOS6 上一切正常,但在 iOS5 上,当我拿着对象并尝试移动它时,它在下载过程中没有移动(这很好),但在此之后它正在改变中心并冻结在我保存的最后一个地方我的手指。

我将不胜感激任何线索如何解决这个问题。

编辑:答案

好的,我找到了答案。也许这不是最好的解决方案,但它正在工作: 在“handleLongPressGestureRecognizer”方法开头调用的方法“loadingFiles”中,我输入:

- (BOOL) loadingFiles:(UIGestureRecognizer*)recognizer

   if (!_isSelectable ||! self.isLoaded)
   
      longPressGestureRecognizer.enabled = NO;
      (...)
   

标志 isLoaded 更改为 YES 的地方有:

longPressGestureRecognizer.enabled = YES;

【问题讨论】:

【参考方案1】:

在 UIGestureRecognizerDelegate 协议参考中写道“gestureRecognizerShouldBegin”在 iOS 3.2 及更高版本中可用,但当我在 Xcode 中使用 ALT 时,还有另一个信息表明它仅在 iOS6 及更高版本中可用

不,你混淆了两个不同的东西。

有一个新的 iOS 6 UIView 方法gestureRecognizerShouldBegin。它具有优先权,并在 UIView 自己的手势响应(例如 UIButton 的可点击性)和更高级别的手势识别器(附加到超级视图)之间进行调解。

有一个手势识别器委托消息gestureRecognizerShouldBegin:一直存在。

【讨论】:

感谢您的回复。那么我应该怎么做才能调用这个方法呢?现在它没有被调用。 我似乎忘记了剧情。这里的“使这个方法被调用”是什么意思?

以上是关于iOS5 上的 UIGestureRecognizerDelegate 和手势的主要内容,如果未能解决你的问题,请参考以下文章

iOS5 上的复杂 JSON

iPhone - iOS5:phonegap 上的地理位置

iOS5上的跳跃/不正确的光谱仪

iOS5 中我的 UIView CGRect 属性上的 KVO 不起作用

如何使用 UIMenuController iOS5.1 防止 UITextView 上的复制/粘贴/选择弹出框

iOS5通知下拉菜单:有没有办法知道用户何时按下iPhone上我的应用程序通知上的清除按钮?