我有一个宽/高为256x256的滚动视图。我有在两个方向(左和右)拉伸的滚动视图的子视图。我将clipToBounds设置为NO,这样我就可以在滚动视图中看到项目。
当用户触摸滚动视图托架中的空间(超过256x256的区域)时,我检查hittest并返回scrollView。
我的问题是滚动视图上的项目是按钮,如果按钮不在256x256的内部,它就不会接收触摸事件。如何在滚动视图上的按钮之间循环,然后将事件转发到按钮?
我是这样做的Paging UIScrollView with peeking neighbor pages
但是我的滚动视图子视图没有接收事件。
我已经在我的视图中尝试了以下所有应该发送事件的方法,但我的按钮将不会接收这些事件。事件链总是停在我的UIScroll视图上-允许我滚动我的项目-但是我如何将事件从滚动视图转发到按钮呢?
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if ([self pointInside:point withEvent:event]) {
return self.scrollView;
}
return nil;
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if ([self pointInside:point withEvent:event]) {
return self.scrollView;
}
return nil;
}
- (UIView *) hitTest:(CGPoint) point withEvent:(UIEvent *)event {
UIView* child = nil;
if ((child = [super hitTest:point withEvent:event]) == self) {
return self.scrollView;
}
return child;
}发布于 2012-01-18 03:03:13
这是答案,也是更好的解决方案。而不是让任意的视图来转发事件,我们只需要在UIScrollView中这样做,所有的按钮和滑动都可以很好地工作。
- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event {
UIView *view = [super hitTest:point withEvent:event];
for (UIView *subview in self.subviews) {
if (view != nil && view.userInteractionEnabled) {
break;
}
CGPoint newPoint = [self convertPoint:point toView:subview];
view = [subview hitTest:newPoint withEvent:event];
}
return view;
}发布于 2012-01-17 10:51:43
你是否覆盖了UIScrollView的hitTest?
- (UIView*)hitTest:(CGPoint)pt withEvent:(UIEvent*)event
{
UIView *contentView = [self.subviews count] ? [self.subviews objectAtIndex:0] : nil;
return [contentView hitTest:pt withEvent:event];
}发布于 2014-03-24 21:37:56
请参阅Matt Galloway的教程How To Use UIScrollView to Scroll and Zoom Content中的在滚动视图之外检测触摸部分-
将滚动视图设置为小于屏幕,并取消选中剪辑子视图:

并将其包装到容器视图中,该视图将事件转发到滚动视图:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == self) {
return _scrollView;
}
return view;
}https://stackoverflow.com/questions/8887958
复制相似问题