我在另一个视图上有一个透明的UIScrollView。
滚动视图具有用于显示信息的内容-文本和图像。
它后面的视图具有用户应该能够点击的一些图像,并且它们上面的内容可以使用所提到的滚动视图来滚动。
我希望能够正常使用滚动视图(没有缩放虽然),但当滚动视图实际上并没有滚动,让点击事件通过它后面的视图。
使用触摸和滚动事件的组合,我可以确定什么时候让点击通过。但是它后面的视图仍然没有接收到它们。
我已经尝试使用这样的东西为所有触摸事件:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"touchesBegan %@", (_isScrolling ? @"YES" : @"NO"));
if(!_isScrolling)
{
NSLog(@"sending");
[self.viewBehind touchesBegan:touches withEvent:event];
}
}
但它不起作用。
另外,在我的情况下,我不能真正应用hitTest和pointInside解决方案,考虑到我的用例。
4条答案
按热度按时间jobtbby31#
首先,
UIScrollView
s只能识别UIPanGestureRecognizer
s和UIPinchGestureRecognizer
s,因此您需要将UITapGestureRecognizer
添加到UIScrollView
,以便它也可以识别任何点击手势:然后,一旦您收到点击手势并触发了
handleTap:
操作,您可以使用locationInView:
来检测点击手势的位置是否实际上在滚动视图下方的某个图像的框架内,例如:这样,上面的代码只有在识别出点击手势时才执行,如果点击位置福尔斯图像内,程序只对滚动视图上的点击做出React;否则,您可以像往常一样滚动
UIScrollView
。6ju8rftf2#
在这里,我提出了我的完整解决方案:
这里的接口:
以及实施:
唯一使用的额外代码是在
UIView+Additions.h
类别中,其中包含以下方法:谢谢
gcuhipw93#
问题是你的
UIScrollView
正在使用事件。要传递它,你必须禁用用户在它上面的交互,但是它不会滚动。但是,如果你有触摸位置,你可以使用convertPoint:toView:
方法计算它会落在底层视图的什么位置,然后通过传递CGPoint
来调用它的方法。从那里,你可以计算出哪个图像被点击了。kmynzznz4#
这样做非常简单:
在代码行“y〈400”处,只需使用自己的逻辑来决定是否要通过或正常处理。