iOS UIScrollView clipToBounds = NO未检测到子视图

时间:2012-01-16 23:55:04

标签: iphone objective-c ios

我的滚动视图宽度/高度为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;
}

4 个答案:

答案 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中的在滚动视图外部检测触摸部分 -

您使滚动视图小于屏幕并且未选中剪辑子视图:

Xcode screenshot

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

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

答案 3 :(得分:-1)

你的滚动视图应该更大。 将无法检测到主滚动视图框架外的所有事件。 如果您需要向用户显示特定的背景区域,请将您的scrollview的背景透明,然后放置另一个视图。