5

我有一个UITextView最重要的,我有多个UIView。任何触摸动作UIView都可以关联到相应IBAction的 . 在我的场景中,双击手势需要与UIView's相关联IBAction,除此之外的任何其他触摸都需要转发到底层UITextView

我做上述场景的代码块

UITextView *textView = [[UITextView alloc] init];

UIView *subview = [[UIView alloc] init];

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
doubleTap.numberOfTapsRequired = 2;
[subview addGestureRecognizer:doubleTap];

[textView addSubview: subview];

我尝试了以下 SO 解决方案,

如何忽略触摸事件并将它们传递给另一个子视图的 UIControl 对象?

使用 hitTest 我无法在 UIViews 中捕获双击手势,该手势位于顶部UITextView

使 UIGestureRecognizer 接收子视图上开始的触摸

从in到的转发UITouch设置没有给出预期的默认行为touchBegan:withEvent:UIViewUITextViewUITextView

是否有任何其他解决方案可用于解决这种情况?

提前致谢。

4

2 回答 2

3

这可以通过以下方式实现:

  1. 让 UITextView 按照如何忽略触摸事件并将它们传递给另一个子视图的 UIControl 对象中的建议处理触摸事件?
  2. 在 UIView 的 hitTest 中保存对它发生的视图的引用,以便以后可以使用
  3. 添加自定义双击手势识别器,检查 hitTest 引用是否不为空,指示双击发生在目标视图上并将事件转发到该视图。如果不是,则使手势识别器失败。要使手势识别器失败,您需要包含 UIKit/UIGestureRecognizerSubclass.h 并将 state 属性设置为 UIGestureRecognizerStateFailed
  4. 将手势识别器添加到 UITextView
  5. 扩展 UITextView 以覆盖gestureRecognizers getter 并循环通过手势识别器以要求自定义手势失败。这必须在 getter 中完成,因为手势识别器似乎经常被重置
于 2013-03-01T22:07:04.280 回答
0

子视图是不必要的,删除它,并替换:

[subview addGestureRecognizer:doubleTap];

和:

[textView addGestureRecognizer:doubleTap];

现在您应该在 tapDetected: 方法中获取您的事件。

为确保您没有更改 UITextView 行为,请使用以下方法:

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

或者

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
于 2013-01-19T13:46:01.357 回答