[英]Receive touch event for subview
我有BooksEAGLView
,它具有用于接收触摸事件的UIButton
。 然后我的目的是增强现实叠加,我将叠加视图添加到BooksEAGLView
然后我的按钮没有收到触摸事件。
我如何获得两个视图的触摸事件。
bookOverlayController = [[BooksOverlayViewController alloc]initWithDelegate:self];
// Create the EAGLView
eaglView = [[BooksEAGLView alloc] initWithFrame:viewFrame delegate:self appSession:vapp];
[eaglView addSubview:bookOverlayController.view];
[self setView:eaglView];
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return ([touch.view.superview isKindOfClass:[BooksEAGLView class]] || [touch.view.superview isKindOfClass:[TargetOverlayView class]]);
}
触摸事件:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"hitTest:withEvent called :");
NSLog(@"Event: %@", event);
NSLog(@"Point: %@", NSStringFromCGPoint(point));
NSLog(@"Event Type: %d", event.type);
NSLog(@"Event SubType: %d", event.subtype);
NSLog(@"---");
return [super hitTest:point withEvent:event];
}
好的,我专门为您做了示例项目。 这是我做的:
在屏幕截图上,您可能会注意到视图层次结构,它重复了您的概念。
这是在CustomView.m中覆盖的hitTest:withEvent
:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
for (UIView *subview in self.subviews.reverseObjectEnumerator) {
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];
if (result != nil && [result isKindOfClass:[UIButton class]]) {
return result;
}
}
}
return [super hitTest:point withEvent:event];
}
此方法通过调用每个子视图的pointInside:withEvent:
方法来遍历视图层次结构,以确定哪个子视图应接收触摸事件。 如果pointInside:withEvent:
返回YES ,则将遍历子视图的层次结构,直到找到包含指定点的最前面的视图。 如果视图不包含该点,则将忽略其视图层次结构的分支。 您很少需要自己调用此方法,但是您可以重写此方法以从子视图中隐藏触摸事件 。 此方法将忽略隐藏的视图对象,禁用的用户交互或alpha级别小于0.01的视图对象。 确定命中时,此方法不考虑视图的内容。 因此,即使指定点位于该视图内容的透明部分中,该视图仍然可以返回。
在甜点上 : 示例项目
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.