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

3

我有一个控制器,使用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个回答

2
如您所知,您收到的点位于视图的坐标系中,这通常应与视图的主图层的坐标系相同。(如果不是,仍然有方法可以转换,但除非您做了一些奇怪的事情,否则最好依赖于这些是相同的事实。)
还要知道,一旦您开始旋转某些内容,它的框架就是未定义的。如果您稍微思考一下框架的工作原理,就会明白为什么必须这样做(您无法使用未旋转的矩形来定义菱形)。
我们可以使用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!
}

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

是的,你说得对,我匆忙中忽略了这个事实,但你给了我指引。谢谢! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接