有一些方法可以将CGPoint从一个UIView传输到另一个UIView,并从一个CALayer传输到另一个。我找不到将CGPoint从UIView的坐标系更改为CALayer的坐标系的方法。

图层及其主 View 是否具有相同的坐标系?我需要在它们之间转换点吗?

谢谢,
科里

[编辑]

感谢您的回答!很难找到有关iPhone和Mac上的CA之间差异/相似性的信息。令我惊讶的是,我在任何Apple文档中都找不到直接解决的问题。

我一直在寻找这个问题的答案,以解决我正在解决的错误,这是迄今为止我的最佳猜测,但是我想我是在树错误的树上。如果坐标系相同,那么我还有另一个问题...

我遇到的实际问题可以在堆栈溢出中找到:
layer hit test only returning layer when bottom half of layer is touched

最佳答案

如果要翻转坐标系统,可以将CALayers的transform属性设置为适当的变换,但是请注意,这也可能会翻转其contents的图形(我没有测试过,但是这样做是有道理的真的)。我断言与UIView关联的CALayer共享相同的坐标系实际上可能是完全错误的。也可能是CALayers使用与UIViews相同的坐标系(即它们从未垂直翻转),但我认为是因为CoreGraphics使用相对于UIKit的翻转坐标系。

一种简单的测试方法是添加一个屏幕大小的CALayer作为 View 层的子层,然后添加另一个小的CALayer作为该 View 的子层。您可以将其设置为显示在(0、0、320、100),然后查看它是否显示在iPhone屏幕的顶部或底部。这将告诉您CoreAnimation的Y轴朝哪个方向。

- (void)viewDidLoad {
  [super viewDidLoad];
  CALayer *rootLayer = [CALayer layer];
  rootLayer.frame = self.view.layer.bounds;
  CALayer *smallLayer = [CALayer layer];
  smallLayer.frame = CGRectMake(0, 0, rootLayer.bounds.size.width, 50);
  smallLayer.backgroundColor = [UIColor blueColor].CGColor;
  [rootLayer addSublayer:smallLayer];
  [self.view.layer addSublayer:rootLayer];
}

我只是自己进行了此测试,看来CALayers实际上使用的坐标系与UIViews相同,因此我断言CALayer翻转Y轴肯定是错误的。但是,如果您直接使用CoreGraphics进行绘制,请注意CoreGraphics确实使用了翻转的Y轴(尽管在UIView子类或CALayer委托(delegate)中进行绘制时,CoreGraphics上下文已经被翻转以匹配UIView的(或CALayer's坐标系)。

因此,简短的答案(如果您到此为止)是CALayer的坐标系应与其对应的UIView的坐标系相匹配。

关于iphone - 将CGPoint从UIView坐标系转换为CALayer坐标系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/410278/

10-11 13:03