TL:博士
不要进行任何转换,只需使用 locationInView: 方法。
长版
为此,您可以使用代码 locationInView: 像这样...
UITouch *touch = [touches anyObject]; //assuming there is just one touch.
CGPoint touchPoint = [touch locationInView:someView];
这会将触摸的屏幕坐标转换为您传入的视图中的坐标。
即,如果用户在子视图中点击点 (10, 10),然后您将其传递给下一个响应者,即父级。当你运行 [touch locationInView:parentView] 时,你会得到一个类似于 (60, 60) 的点(从你的图表中粗略猜测)。
locationInView 的 UITouch 文档
locationInView:返回给定视图坐标系中接收器的当前位置。
-(CGPoint)locationInView:(UIView *)view
参数
看法
您希望触摸位于其坐标系中的视图对象。处理触摸的自定义视图可以指定 self 以在其自己的坐标系中获取触摸位置。传递 nil 以获取窗口坐标中的触摸位置。
返回值
指定接收器在视野中的位置的点。
讨论
此方法返回 UITouch 对象在指定视图坐标系中的当前位置。因为触摸对象可能已经从另一个视图转发到一个视图,所以此方法执行任何必要的触摸位置到指定视图坐标系的转换。
例子
您有一个名为 parentView frame (0, 0, 320, 480) 的视图,即整个屏幕。这有一个名为 childView frame (50, 50, 100, 100) 的子视图。
在子视图中
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self];
NSLog(@"Child touch point = (%f, %f).", touchLocation.x, touchLocation.y);
[self.nextResponder touchesBegan:touches withEvent:event];
}
在父视图中
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView:self];
NSLog(@"Parent touch point = (%f, %f).", touchLocation.x, touchLocation.y);
}
*现在...
用户在子视图的正中心按下屏幕。
该程序的输出将是...
Child touch point = (50, 50). //i.e. this is the center of the child view relative to the **child view**.
Parent touch point = (150, 150). //i.e. this is the center of the child view relative to the **parent view**.
我根本没有进行任何转换。方法 locationInView 为您完成所有这些工作。我认为您正试图使其复杂化。