我有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];
}
答案 0 :(得分:1)
好的,我专门为您做了示例项目。我在这里做了什么:
在屏幕截图中,您可能会注意到视图层次结构,它会重复您的概念。
以下是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的视图对象。在确定命中时,此方法不会考虑视图的内容。因此,即使指定的点位于该视图内容的透明部分,仍然可以返回视图。
关于甜点:Sample Project