在设备方向改变之后,翻译触摸坐标时出错

好的情况是,我有一个自定义类创build一个包含图像的视图,并处理所有自己的触摸事件。 偶尔我想检查一下,如果移动它会导致它重叠父视图上的另一个视图。 因此,在相关的触摸事件之后,我在父视图上调用一个方法,将最后一个触摸坐标传递给它并返回一个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”,但是它给的价值也没有多大意义。 我认为在坐标系已经旋转的情况下它不起作用。

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

所以你应该能够检索应用到你的UIView的当前CGAffineTransform,然后将这个CGAffineTransform应用到你的UITouch的使用CGPointApplyAffineTransform的点(可能是在反转AffineTransform之后,将反转应用到你的点上,没有testing过这个代码,只从内存中写入)

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

根viewController的视图总是像肖像模式。 你应该在根目录中插入一个新的视图。 而这个新的观点将会正确行事,根据苹果公司的说法,会给出正确的尺寸和坐标。

例如 ;

 UIView *v = self; while ([[v superview] superview] != NULL) { v = [v superview]; } UITouch *touch = [touches anyObject]; CGPoint touchPoint = [touch locationInView:v]; 

touchPoint将是正确的。