2016-01-23 144 views
1

我有控制器,其中使用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); 
      } 
    } 
} 

回答

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! 
} 

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

+0

是的,你是对的,我很想念这个事实,但你告诉我方向。谢谢! – Eugene