【问题标题】:Trouble translating Touch coordinates following device orientation change设备方向更改后无法翻译触摸坐标
【发布时间】:2011-11-06 08:08:47
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    所以您应该能够检索应用到您的 UIView 的当前 CGAffineTransform,然后使用 CGPointApplyAffineTransform 将此 CGAffineTransform 应用到您的 UITouch 点(可能在反转 AffineTransform 之后,将逆变换应用到您的点。避风港' t 测试了这段代码,只从内存中写入)

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

    【讨论】:

    • 您好,感谢您的回复。我试图实现这一点,但没有太大的成功。我在其中设置了一个断点并查看了“inverseTransform”的值,但它似乎并没有随着屏幕的方向而变化?
    • 只是为了确认一下,当我旋转屏幕(a 1.0 b 0.0 c 0.0 d 1.0)时,我的主 UIView 和我感兴趣的任何子视图的转换似乎都发生了变化。
    • 好吧,也许这不是正确视图的转换。通常它是您的 ViewController 本身的视图的转换。如果找不到它,请尝试从视图回溯到它的所有 superviews
    • 我的层次结构是 Window、TabbedViewController、UIView、customSubViews。从 UIView 我尝试检查父级的变换及其(a 0.0 b 0.0 c 0.0 d 0.0)并且也不随旋转而改变。我似乎没有意见可以检查。
    • 不幸的是,我现在附近没有我的 Mac 来检查自己,但你的任何变换都与身份变换不同,这似乎很奇怪......我想知道你怎么看然后转了?!也许尝试测试视图层的 CATransform ?如果周末前有时间,我会尝试自己做一些测试
    【解决方案2】:

    根 viewController 的视图总是像竖屏模式。您应该在根视图内插入一个新视图。并且这个新视图将正确运行,根据 Apple 的说法给出正确的大小和坐标。

    例如;

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

    touchPoint 是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2016-11-19
      相关资源
      最近更新 更多