我有一个父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]
获取触摸位置。
答案 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为您完成所有这些。我认为你试图让它复杂化。