如何确定 UITapGestureRecognizer 触摸了哪个视图?
Posted
技术标签:
【中文标题】如何确定 UITapGestureRecognizer 触摸了哪个视图?【英文标题】:How to determine which view was touched by UITapGestureRecognizer? 【发布时间】:2013-08-27 00:17:09 【问题描述】:我有一个带有子视图的UIScrollView
和一个UITapGestureRecognizer
。
我这样创建识别器:
UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
[self addGestureRecognizer:tgr];
UITapGestureRecognizer
的 view 属性指向滚动视图本身,即使用户触摸了不同的视图。我需要知道触摸是否直接在滚动视图上。
【问题讨论】:
sn-p代码中的self是什么?滚动视图?通常,您会执行 [self.whateverViewAspect addGestureRecognizer:] 以便专门将手势识别器附加到部分视图 尝试将滚动视图设置在单独的 UIView 对象之上?像 [viewWtihSCrollviewOnTopOf addSubview:scrollView]; [viewWtihSCrollviewOnTopOf addGestureRecognizer:tgr]; 【参考方案1】:Paul 的建议很好,但如果您不想(或不能)子类化或成为识别器的代表,还有另一种方法。
您可以向手势识别器询问其locationInView:
,然后使用scrollView 的hitTest:withEvent:
方法(在UIView 上定义)检索该点所在的视图。比如:
CGPoint location = [recognizer locationInView:scrollView];
UIView *touchedView = [scrollView hitTest:location withEvent:nil];
【讨论】:
【参考方案2】:您可以成为UITapGestureRecognizer
的任一子类,并通过重写touchesBegan:withEvent:
方法来添加一个新的ivar 来保存此信息
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
/*
* If you wanted you could store a set of all the views to allow
* for multiple touches
*/
self.touchedView = [touches.anyObject view];
[super touchesBegan:touches withEvent:event];
或者,如果您愿意,您可以成为UITapGestureRecognizer
的代表,并通过实现gestureRecognizer:shouldReceiveTouch:
将点击的视图作为属性存储在您的类中
【讨论】:
以上是关于如何确定 UITapGestureRecognizer 触摸了哪个视图?的主要内容,如果未能解决你的问题,请参考以下文章