【问题标题】:Detect touch event in CALayer's coordinate system在 CALayer 的坐标系中检测触摸事件
【发布时间】:2016-01-23 13:29:27
【问题描述】:

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

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

有什么想法吗?

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,你是对的,我很快就错过了这个事实,但你给我指明了方向。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多