检测UIScrollView之外的点击

我已经实现了一个按照这种技术的页面滚动( iOS开发。如何扩展UIScrollView的滚动事件响应区域? ),它的工作原理是一样的。

我正在滚动的视图包含了几个button,我希望能够不仅能够点击居中/分页的滚动视图,还能够点击左侧和右侧的button。 我找不到任何方法来解决这个问题,但我并不是一个真正的iOS-Jedi,但是希望你们中的一个可以:)

我的xib,以UIScrollView为中心

因此,从屏幕上可以看到,UIScrollView大约是窗口宽度的三分之一,UIScrollView的内容大得多:大约1500px,并且包含许多按编程添加的button。 这个解决scheme和实际工作的一部分很酷的事情是,button:1)被分页到滚动视图2)在滚动视图外是可见的(因为“剪辑子视图”没有选中的滚动视图)3)button是在uiscrollview中可见时可点击。

但什么不工作,只是这样的: – 当前窗口外的button点击时,他们没有收到“他们”的点击,而是将事件转发到底部(窗口的白色部分)视图。

所以,

我终于设法解决了这个难题 ,解决scheme分为两部分。 问题是,您回想起来,点击事件并没有传到UIScrollView之外(可见)的button。 事实certificate,这些点击被底层视图所捕获,并且有可能通过针对谁被打的规则稍微弯曲一些规则来操纵他们的目标,从而诱骗事件通过你想要的地方。 不知道这是如何做,但它解决了我的问题。 🙂

1)第一个必须在底部视图中重写以下方法,以便在适当时返回滚动视图而不是自身。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *view = [super hitTest:point withEvent:event]; if (view == self) return [self scrollView]; return view; } 

2)scrollView必须重写两个方法来将点击移交给它所包含的对象。

  - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *view = [super hitTest:point withEvent:event]; // Always return us. return view ; } 

 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { // We want EVERYTHING! return YES; } 

非常感谢您的意见和帮助意愿。 我好

受到@tommys提到的答案的启发,事实certificate,通过重写UIView的hinTest方法并返回scrollView,实际上可以将此UIView的滑动分离到scrollView。

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *view = [super hitTest:point withEvent:event]; // Doing this make you detached the swiping to the scrollView if (view == self) return [self scrollView]; return view; } 

所以这个UIView就像scrollView的一个扩展滚动区域,这个想法就在这里。 如果您在窗口的scrollView和相同大小上创build了UIView遮罩,那么在窗口内的任意位置滑动都会使scrollView滚动。

这里是ExtensionScrollArea的例子

这是我的版本:

  1. 打在容器中的testing

     - (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event { if ( CGRectContainsPoint( self.frame, point ) && ! self.hidden ) // <-- * { if ( ! CGRectContainsPoint( scrollView.frame, point ) ) return scrollView; } return [super hitTest:point withEvent:event]; } 

(*)如果您正在移动或以其他方式隐藏您的视图,则此标记行很重要,例如,如果您有多个视图,每个视图都有自己的滚动视图。 如果你没有这条线,你可能会把你所有的触摸指向屏幕上的滚动视图!

  1. 在滚动视图覆盖

     - (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event { return YES; } 

(在容器的hitTest中,你可以在if语句中排除额外的框架以进行默认行为):)