在 CALayer 的坐标系中检测触摸事件

Detect touch event in CALayer's coordinate system

我有控制器,使用 CAKeyframeAnimation 随机掉落很多图片,我应该通过触摸轨道裁剪这些图片, 任何使用 CALayer 呈现动画图像的动画,我正在尝试使用 [layer presentationLayer].

检测该层内的触摸事件

问题是 - 为了裁剪此图像,我应该从我的触摸跟踪器段和图层创建路径,我还不知道如何创建此路径,但这里的问题是如何在跌落时检测此触摸点CALayer坐标系,附图更详尽

有什么想法吗?

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

- (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);
            }
    }
}

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

同样重要的是要知道,一旦您开始旋转某些东西,它的 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!
}

边界总是被定义的,因为它们总是在图层自己的坐标系中。所以我们把这个点转换成图层的坐标系,问这个点是否存在于它的边界内。