如何在UIScrollView的父视图中检测“触摸按下”?

7
我有一个包含UIScrollViewUIView,我想在用户点击UIScrollView时捕获UIView中的“Touch Down”事件。
我尝试在我的UIViewController中包含所有touchesBegan/Ended/Cancelled处理程序,但是当在主UIView中包含的UIScrollView内部进行点击时,它们都不会触发。
最好的方法是什么?
4个回答

2

在UIView中实现touchesBegan:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // assign a UITouch object to the current touch
    UITouch *touch = [[event allTouches] anyObject];

    // if the view in which the touch is found is myScrollView
    // (assuming myScrollView is the UIScrollView and is a subview of the UIView)
    if ([touch view] == myScrollView) {
        // do stuff here
    }
}

一个小提示:确保在UIView中将userInteractionEnabled设置为YES。

并且,根据我在下面的自我回答,将scrollView的userInteractionEnabled设置为NO。 - wgpubs
3
这会违背uiscrollview的设计初衷,因为我们必须在“do stuff here”下实现滚动操作。 - Gamma-Point

1

您还可以将手势识别器添加到您的父视图中。 例如,如果您需要激活/停用覆盖滚动视图的按钮之类的东西,则可以添加一个轻拍手势:

self.tap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)] autorelease];
tap.numberOfTapsRequired = 1;

["containerView" addGestureRecognizer:tap];

手势确实保留了滚动视图的交互


tapgesturerecognizer仅检测轻触(touchDown+touchUp)。因此,它不适用于touchDown事件的检测。 - kas-kad

1
你也可以在你的UIView子类中实现hitTest:withEvent:方法。这个方法被调用来确定哪个子视图应该接收触摸事件。所以在这里,你可以跟踪所有通过你的视图传递的事件,或者隐藏一些子视图的事件。在这种情况下,你可能不需要禁用滚动视图的用户交互。
更多关于这个方法的细节,请参考UIView类的参考文档。

-3

您需要禁用滚动视图的用户交互,如下所示...

scrollView.userInteractionEnabled = NO;

一旦禁用,UIScrollView的父视图将收到touchesBegan事件。


1
这样做违背了一开始使用滚动视图的初衷。 - Zorayr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接