19

我目前正在使用 UIScrollView 作为滚动/拖动我在我的应用程序上显示的图形的光标/标记的一种方式。我使用scrollViewDidScroll等来检测contentoffset的位置,并根据这个位置操纵我在屏幕上显示的内容。

我的问题是是否也可以检测到用户在屏幕上的单击并获取此点击的位置(然后将 contentoffset 设置为此位置)?

我已经阅读了一些描述创建 uiscrollview 子类的教程,但似乎这些子类只考虑单击而不是拖动/滚动。

有没有人知道我如何能够检测到用户在我的 UIScrollView 上的单击,同时仍然具有其滚动/拖动功能?
先感谢您!

4

4 回答 4

33

为您的 scrollView 对象使用以下代码:

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;
singleTapGestureRecognizer.enabled = YES;
singleTapGestureRecognizer.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTapGestureRecognizer];
//[singleTapGestureRecognizer release]; Not needed in ARC-enabled Project

}

- (void)singleTap:(UITapGestureRecognizer *)gesture {  
//handle taps   
}
于 2012-06-28T05:17:18.140 回答
6

斯威夫特 5

let scrollViewTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(_:)))
scrollViewTapGestureRecognizer.numberOfTapsRequired = 1
scrollViewTapGestureRecognizer.isEnabled = true
scrollViewTapGestureRecognizer.cancelsTouchesInView = false
scrollView.addGestureRecognizer(scrollViewTapGestureRecognizer)

@objc func scrollViewTapped(_ sender: UITapGestureRecognizer) {
    print("UIScrollView was tapped.")
}
于 2015-02-01T17:22:56.383 回答
1

问题的第一部分很容易上手。如果你有一个 UIScrollView 子类,你可以添加一个 touchesEnded 覆盖,如下所示:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    if ([touch tapCount] == 1) {

        CGPoint location = [touch locationInView:self];

        [self setContentOffset:location animated:YES];

    }


}

在滚动视图的情况下,触摸的 -locationInView 实际上已经将 ContentOffset 添加到其中。这段代码要做的是滚动滚动视图,使用户触摸的点位于视图的左上角。这可能不是您想要的,因此如果您希望滚动最终达到 10 个像素,则必须执行诸如添加偏移量之类的操作,或者您将制作另一个只有 x 值的 CGPoint如果您的滚动条不是从左到右,则为位置。

这不会干扰能够实际进行滚动。

于 2012-06-28T02:48:24.690 回答
0

您是否考虑过将 UITapGestureRecognizer 附加到滚动视图?我已将 UITapGestureRecognizer 附加到 UIScrollView 并在需要触摸时使用–gestureRecognizerShouldBegin:和/或–gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:取消内置平移。

于 2012-06-28T01:54:33.010 回答