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

标签 ios objective-c animation layer coordinate-systems

我有 Controller ,使用 CAKeyframeAnimation 随机掉落大量图片我应该通过触摸轨道来裁剪这些图像,
任何使用 CALayer 的动画为了呈现动画图像,我正在尝试使用 [layer presentationLayer] 检测该层内的触摸事件.

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

有任何想法吗?

Explanation pic.

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

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

最佳答案

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

同样重要的是要知道,一旦您开始旋转某些东西,它的 frame未定义。如果您稍微考虑一下框架的工作原理,就会很明显为什么会出现这种情况(您不能使用未旋转的矩形来定义钻石)。

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

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

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

关于ios - 在 CALayer 的坐标系中检测触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34964065/

相关文章:

Android recyclerview View 持有者的内部 View 的动画

jquery - 如何让图片在页面中随机移动并在移动时旋转 Angular (使用jQuery或CSS)

objective-c - "unrecognized selector"不存在

ios - 如何在 Xcode 上删除 iOS Team Provisioning Profile/AppID?

iOS:闹钟应用程序在应用程序不活动后如何播放声音?

ios - 如何使 UILabel 调整大小以适合文本

ios - 从Parse.com流音频-没有检索到数据?

objective-c - 逻辑 && 语句

ios - 如何在 objective-c 中返回对象的 UIColor?

python - 使用matplotlib.pyplot制作一维波动方程的动画