iPhone - UIScrollView... 检测触摸的坐标

6
可能重复:
UIScrollView获取触摸事件 在UIScrollView中,是否可以检测到手指触摸的位置?
我的意思是,假设用户以这种方式使用手指:轻点和滚动,抬起手指并再次轻点和滚动等。 是否可以知道点击发生的CGPoint与scroller所在的self.view相关? 滚动条占据整个self.view。
谢谢。
4个回答

12

您可以使用手势识别来完成此操作。要检测单击位置,请使用UITapGestureRecognizer

UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)] autorelease];
[myScrollView addGestureRecognizer:tapRecognizer];

- (void)tapAction:(UITapGestureRecognizer*)sender{ 
    CGPoint tapPoint = [sender locationInView:myScrollView];
    CGPoint tapPointInView = [myScrollView convertPoint:tapPoint toView:self.view];
}

要将tapPoint转换为self.view,您可以使用UIView类中的convertPoint:toView:方法。


1
不是的。只有在我轻触而不滚动时才会触发tapAction。如果我像我说的那样,轻触、滚动、抬起手指、轻触、滚动、抬起手指等等,就不会检测到任何轻触。如果在大幅滑动后滚动器也在滚动,也不会检测到任何轻触。滚动器必须保持静止,并进行一次干净的轻触,才能正常工作。 - Duck
1
还有许多其他的手势识别器 - UIPanGestureRecognizer,UIPinchGestureRecognizer,UISwipeGestureRecognizer,UIRotationGestureRecognizer。此外,您还可以创建自定义识别器来检测非常复杂的触摸操作。我提供了一个使用简单触摸的更流行的示例。 - beryllium
@RubberDuck 你解决了这个问题吗?我也遇到同样的问题... 我正在处理UICollectionView,想要检测手指触摸的位置是否在cell视图上。 - X.Y.
我在我的框架下有 UIkit.framework,但我找不到 UITapGestureRecognizer。当我尝试写 UITapGestureRecognizer 时,它会报错并显示未找到。 - Adil Malik
@beryllium 为什么你不直接使用 [sender locationInView: myScrollView] 呢? - Paweł Brewczynski

0

在这种情况下,您需要子类化UIScrollView。 - beryllium

0

这并不容易。TouchesBegan 只有在滚动视图静止时才能检测到触摸,如果它已经在移动并且我触摸它,TouchesBegan 将无法检测到任何东西。 - Duck

-1
你可以在视图中找到位置并添加滚动偏移量。现在,你的下一个问题是-(void)touchesBegan:touches:event不会被调用,因为事件将被发送到你的滚动视图。这可以通过子类化你的UIScrollView来解决,并让滚动视图将触摸事件发送到下一个响应者(即你的视图)。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Position of touch in view
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    // Scroll view offset
    CGPoint offset = scrollView.contentOffset;

    // Result
    CGPoint scrollViewPoint = CGPointMake(touchPoint.x, touchPoint.y + offset.y);
    NSLog(@"Touch position in scroll view: %f %f", scrollViewPoint.x, scrollViewPoint.y);
}

1
不对。touchesBegan仅在我轻触而不滚动时触发。如果我像我说的那样,轻触、滚动、抬起手指、轻触、滚动、抬起手指等等,就不会检测到任何轻触。如果滚动器在大幅滑动后也在滚动,则也不会检测到任何轻触。滚动器必须保持静止,并进行一次干净的轻触才能使其正常工作。这并不像看起来那么容易。 - Duck

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