在 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!
}
边界总是被定义的,因为它们总是在图层自己的坐标系中。所以我们把这个点转换成图层的坐标系,问这个点是否存在于它的边界内。
我有控制器,使用 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!
}
边界总是被定义的,因为它们总是在图层自己的坐标系中。所以我们把这个点转换成图层的坐标系,问这个点是否存在于它的边界内。