无法在设备方向更改后转换触摸坐标

时间:2011-08-29 20:47:31

标签: objective-c ios xcode rotation coordinate-transformation

好的情况是我有一个自定义类,它创建一个包含图像的视图并处理所有自己的触摸事件。偶尔我想检查是否移动它会导致它与父视图上的另一个视图重叠。因此,在相关触摸事件之后,我在父视图上调用一个方法,将最后一个触摸坐标传递给它并返回BOOL。当应用程序保持纵向时,此工作正常。

问题在于旋转设备并且所有图像都自动旋转后,传递的CGPoint现在处于旋转坐标系中,与父视图相比,被调用的CGRectContainsPoint方法不再正常工作。

在我的willAnimateRotationToInterfaceOrientation方法中,我正在调整每个自定义视图的位置,以改善新方向的布局,例如

view.frame = CGRectMake((view.frame.origin.x*1.5),(view.frame.origin.y/1.5),view.frame.size.width,view.frame.size.height);

我读到调用setBound方法然后会重置坐标系:

[view setBounds:view.frame];

但这对我的情况没有影响。我也尝试过修改'convertPoint:toView',但它给出的值也没有多大意义。我得出结论,在坐标系旋转的情况下它不起作用?

2 个答案:

答案 0 :(得分:1)

当您的视图被旋转时(使用自动旋转机制),iOS只需将CGAffineTransform应用于您的视图,即可旋转其内容。

所以你应该能够检索应用于你的UIView的当前CGAffineTransform,然后使用CGPointApplyAffineTransform将这个CGAffineTransform应用到你的UITouch点(可能在反转AffineTransform之后,将逆变换应用到你的观点。没有测试过这段代码,只是从内存中写出这个代码)

UITouch* touch = [touches anyObject];
CGPoint pt = [touch locationInView:self];
CGAffineTransform inverseTransform = CGAffineTransformInvert(self.transform);
CGPoint transformedPoint = CGPointApplyAffineTransform(pt,inverseTransform);

答案 1 :(得分:0)

根视图控制器的视图始终像纵向模式一样。您应该在根目录中插入新视图。根据Apple的说法,这个新视图将正确运行,将提供正确的大小和坐标。

例如

;

UIView *v = self;
while ([[v superview] superview] != NULL) {
    v = [v superview];
}

UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:v];

touchPoint将是正确的。