如何在传递给下一个响应者之前更改UITouch的位置

时间:2013-01-03 15:24:37

标签: ios uiview

我有一个父UIView和一个孩子UIView,我想让一个触摸从子到父,并由两个视图处理。

y--------------
| parent      |
|   x------   |
|   |child|   |
|   |_____|   |
|_____________|

所以在子视图中,我覆盖:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // child touch handle 
    // ...
    // parent touch handle
    [self.nextResponder touchesBegan:touches withEvent:event];
}
<德尔> 但当我触摸孩子的`x`时,它转发到父母的'y`(相对于父母)。 我想要一个传递效果(在孩子的'x`,在父母中传递到'x`),所以我需要在转发之前更改触摸的位置,对吗? 我该怎么做?

谢谢@Fogmeister。就是这样。

UITouch现在可以传递给父母。在父母的touchesBegan中,请致电

[touch locationInView:self]

获取触摸位置。

1 个答案:

答案 0 :(得分:4)

<强> TL:DR

不要进行任何转换,只需使用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 *)视图

参数

视图

您希望触摸位于其坐标系中的视图对象。处理触摸的自定义视图可以指定self以在其自己的坐标系中获得触摸位置。传递nil以获取窗口坐标中的触摸位置。

返回值

指定接收器在视图中的位置的点。

讨论

此方法返回指定视图坐标系中UITouch对象的当前位置。由于触摸对象可能已从另一个视图转发到视图,因此此方法会执行触摸位置到指定视图坐标系的任何必要转换。

示例

您有一个名为parentView frame(0,0,320,480)的视图,即整个屏幕。这有一个名为childView框架的子视图(50,50,100,100)。

在childView

- (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];
}

在parentView

- (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为您完成所有这些。我认为你试图让它复杂化。