我的滚动视图宽度/高度为256x256。我有滚动视图的子视图在两个方向(左和右)伸展。我将clipToBounds设置为NO,这样我就可以在滚动视图中看到这些项目了。
当用户触摸scrollview holder中的空格(超出256x256的区域)时,我会检查hittest并返回scrollView。
我的问题是我的滚动视图上的项目是按钮,如果按钮不在256x256内,则它没有接收到触摸事件。如何循环滚动视图上的按钮,然后将事件转发到按钮?
我这样做Paging UIScrollView with peeking neighbor pages
但我的scrollview子视图没有收到事件。
我在我的视图中尝试了以下所有内容,它应该发送事件并且我的按钮不会接收事件。事件链总是在我的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;
}
答案 0 :(得分:6)
这是答案和更好的解决方案。我们只是在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;
}
答案 1 :(得分:0)
你是否覆盖了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];
}
答案 2 :(得分:0)
请参阅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;
}
答案 3 :(得分:-1)
你的滚动视图应该更大。 将无法检测到主滚动视图框架外的所有事件。 如果您需要向用户显示特定的背景区域,请将您的scrollview的背景透明,然后放置另一个视图。