2012-01-16 15 views
5

我有一个宽度/高度为256x256的滚动视图。我有两个方向(左侧和右侧)的滚动视图的子视图。我将clipToBounds设置为NO,因此我可以在滚动视图中看到这些项目。iOS UIScrollView clipToBounds = NO未检测到子视图

当用户触摸scrollview持有者(超出256x256的区域)的空间时,我检查hittest并返回scrollView。

我的问题是我的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; 
} 

回答

-1

您的滚动视图应该更大。 主滚动视图框架之外的所有事件都不会被检测到。 如果您需要向用户显示特定的背景区域,请将您的滚动视图的背景透明化,并放置另一个视图。

+0

我做了scrollview的大小,因为我需要分页才能正常工作。如果我将滚动视图宽度扩展为全宽度,那么它将页面全宽(而不是一个图标)。有没有一种方法来编程设置分页位置? – spentak

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]; 
} 
+0

我在我的scrollview自定义类中有这个确切的代码 - 但按钮从来没有收到事件。 – spentak

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; 
} 
+0

我一直在努力做同样的事情,这对我来说非常合适。谢谢。 – ultrafez

0

看到外面滚动视图部分检测触摸的马特·加洛韦的教程How To Use UIScrollView to Scroll and Zoom Content -

你让滚动视图比屏幕和剪辑子视图选中小:

Xcode screenshot

并将其包装到容器视图中,该视图将事件转发到滚动视图:

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