除了双击到 UITextView 之外的前向触摸
Posted
技术标签:
【中文标题】除了双击到 UITextView 之外的前向触摸【英文标题】:Forward touches other than double tap to UITextView 【发布时间】:2012-12-27 07:23:54 【问题描述】:我有一个UITextView
,除此之外我还有多个UIView
。 UIView
上的任何触摸动作都可以关联到对应的IBAction
。在我的场景中,双击手势需要与UIView
的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 解决方案,
How to ignore touch events and pass them to another subview's UIControl objects?
使用 hitTest 我无法在位于 UITextView
之上的 UIViews 中捕获双击手势
Make UIGestureRecognizer to receive touches started on subviews
从UIView
中的touchBegan:withEvent:
转发UITouch
到UITextView
不会给出UITextView
的预期默认行为
还有其他解决方案可以解决这种情况吗?
提前致谢。
【问题讨论】:
【参考方案1】:这可以通过以下方式完成:
-
让 UITextView 按照How to ignore touch events and pass them to another subview's UIControl objects? 中的建议处理触摸事件
在 UIView 的 hitTest 中保存对发生它的视图的引用,以便以后可以使用它
添加自定义双击手势识别器,检查 hitTest 引用是否不为空,指示双击发生在目标视图上并将事件转发到该视图。如果不是,则使手势识别器失败。要使手势识别器失败,您需要包含 UIKit/UIGestureRecognizerSubclass.h 并将 state 属性设置为 UIGestureRecognizerStateFailed
将手势识别器添加到 UITextView
扩展 UITextView 以覆盖gestureRecognizers getter 并循环遍历手势识别器以要求自定义手势失败。这必须在 getter 中完成,因为手势识别器似乎经常被重置
【讨论】:
【参考方案2】:子视图是不必要的,去掉它,替换:
[subview addGestureRecognizer:doubleTap];
与:
[textView addGestureRecognizer:doubleTap];
现在您应该在 tapDetected: 方法中获取您的事件。
为确保您没有更改 UITextView 行为,请使用以下方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
或
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
【讨论】:
以上是关于除了双击到 UITextView 之外的前向触摸的主要内容,如果未能解决你的问题,请参考以下文章
如何将触摸从 UITextView 传递到 UITableViewCell