检测CALayer坐标系

时间:2016-01-23 13:29:28

标签: ios objective-c animation layer coordinate-systems

我有控制器在哪里使用CAKeyframeAnimation随机掉落很多图片我应该通过触摸轨迹来裁剪这些图像, 使用CALayer呈现动画图像的任何动画,我尝试使用[layer presentationLayer]检测此图层内的触摸事件。

问题是 - 为了裁剪这个图像,我应该从我的触摸跟踪器段和图层创建路径,我还没有弄清楚如何创建这个路径,但这里的问题是如何在下降时检测此触摸点CALayer坐标系,附图更具信息性。

有什么想法吗?

Explanation pic.

为了检测与控制器坐标系相关的层中的触摸点,我使用以下代码:

- (void) touchesMoved:(NSSet *)touches :(CGPoint) movingPoint :(UIEvent *)event
{
    NSArray *layers = [[contextView layer] sublayers];
    for (CALayer *layer in layers) {
            CGRect imageRect = [[layer presentationLayer] frame];
            if(CGRectContainsPoint(imageRect, movingPoint)) {
                NSLog(@"Image position - x %f y %f", movingPoint.x, movingPoint.y);
            }
    }
}

1 个答案:

答案 0 :(得分:0)

您可能知道,您的接收点位于视图的坐标系中,该坐标系通常应与视图的主图层坐标系相同。 (如果没有,仍然有办法转换它,但除非你做了一些奇怪的事情,否则只依靠这些是相同的事实会更容易。)

了解一旦你开始旋转某些东西,它的frame未定义也很重要。如果您对框架的工作方式有所了解,应该明白为什么会出现这种情况(您无法使用未旋转的矩形来定义钻石)。

我们可以使用convertPoint:fromLayer:轻松地从一个系统转换到另一个系统。 iOS中没有touchesMoved:movingPoint:方法,因此我假设这是一种自定义方法,您已经在自己的坐标系中找到了该点。所以你想要的东西是:

CGPoint pointInLayer = [[layer presentationLayer] convertPoint:movingPoint fromLayer:self.view.layer];
CGRect layerBounds = [[layer presentationLayer] bounds];
if (CGRectContainsPoint(layerBounds, pointInLayer)) {
    // Intersect!
}

始终定义边界,因为它们始终位于图层自己的坐标系中。因此,我们将该点转换为图层的坐标系,并询问该点是否存在于其边界内。