如何将子视图上的触摸事件的坐标转换为其父视图中的坐标?

Posted

技术标签:

【中文标题】如何将子视图上的触摸事件的坐标转换为其父视图中的坐标?【英文标题】:How can I convert the coordinates of a touch event on a subview to the coordinates in its parent view? 【发布时间】:2010-10-30 22:32:04 【问题描述】:

我正在深入研究 ios 开发,并且正在玩触摸事件。我有一个名为UIPuzzlePiece 的类,它是UIImageView 的子类,它代表可以在屏幕上移动的拼图对象。我的目标是能够用手指在屏幕上移动拼图。

目前,我在 UIPuzzlePiece 类中实现了 touchesBegan 和 touchesMoved 事件...

// Handles the start of a touch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

  UITouch *touch = [[event touchesForView:self] anyObject];
  CGPoint cgLocation = [touch locationInView:self];
  [self setCenter:cgLocation];


// Handles the continuation of a touch.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  
  UITouch *touch = [[event touchesForView:self] anyObject];
  CGPoint cgLocation = [touch locationInView:self];
  [self setCenter:cgLocation];

我面临的问题是返回的 CGPoint 位置表示 UIPuzzlePiece 视图内的位置,这是有道理的,但我需要知道父视图内的触摸位置。这样,[self setCenter:cgLocation] 语句实际上会将 UIPuzzlePiece 移动到触摸的位置。我总是可以编写一些 hacky 算法来转换它,但我希望有更好或更简单的方法来实现我的目标。如果我只有一个拼图,我会在父视图的视图控制器中实现触摸事件代码,但是我有很多拼图,这就是我在 UIPuzzlePiece 视图中处理它的原因。

你的想法? 非常感谢您的智慧!

【问题讨论】:

你为什么要求[event touchesForView:self] 而不是仅仅使用提供的touches 参数? 因为我是菜鸟,谢谢指出! 【参考方案1】:

UIView 实现了-convertRect:fromView:-convertRect:toView:-convertPoint:fromView:-convertPoint:toView:。听起来您只需要使用后一种方法在视图坐标空间之间进行转换。例如,如果你想将一个CGPoint从self的坐标空间转换到父视图,你可以使用[self convertPoint:thePoint toView:self.superview]或者你可以使用[self.superview convertPoint:thePoint fromView:self](它们会做同样的事情)。

【讨论】:

以上是关于如何将子视图上的触摸事件的坐标转换为其父视图中的坐标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在其父视图范围之外启用视图的触摸?

ios开发事件处理之 四:hittest方法的底层实现与应用

如何将子视图从其父视图的父视图置于顶部

如何在其父视图坐标系中获得子视图的有效边界

将 UICollectionView 触摸事件传递给其父 UITableViewCell

如果 UIButton 的位置超出其父视图但它是可见的,它可以响应触摸事件吗?