1

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

4

2 回答 2

1

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

因此,您应该能够检索应用于您的 UIView 的当前 CGAffineTransform,然后将此 CGAffineTransform 应用到您的 UITouch 使用CGPointApplyAffineTransform(可能在反转 AffineTransform 之后,将逆变换应用于您的点。尚未测试此代码,仅这是凭记忆写的)

UITouch* touch = [touches anyObject];
CGPoint pt = [touch locationInView:self];
CGAffineTransform inverseTransform = CGAffineTransformInvert(self.transform);
CGPoint transformedPoint = CGPointApplyAffineTransform(pt,inverseTransform);
于 2011-08-29T21:25:47.400 回答
0

根 viewController 的视图总是像纵向模式一样。您应该在根视图内插入一个新视图。根据苹果的说法,这个新视图将正确运行,将给出正确的大小和坐标。

例如 ;

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

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

touchPoint 将是正确的。

于 2013-04-01T13:23:52.533 回答