4

我有一个问题,我希望你能帮助我。顺便说一句,这是针对 iPad 的。

我有一个 UIScrollView、UIImageView、CAShapeLayer 和一个 CGMutablePathRef。

1-所以,我在 UIImageView 中加载了一个图像

2- 然后,我解析了文件中的所有路径,然后将它们添加到 CAShapeLayer(s),即每个 CAShapeLayer 都是一个路径。

3-然后我将所有 CAShapeLayer(s) 添加到 UIImageView.layer

4- 我做了第 3 步,所以我可以使用下面的函数来返回包含图像和路径的视图。这有助于将路径和图像缩放在一起。

- (UIView *)viewForZoomingInScrollView: (UIScrollView *)scrollView 
{
    return myUIImageView;
}

5-然后我将 UIImageView 添加到 UIScrollView。

6-然后我将 UIScrollView 子类化,这样我就可以获得 touchesBegan 等。

*注意:当我使用 CGPathContainsPoint(aLayer.path, &transf, touchPoint, NO) 单击它们时,我的所有触摸事件(例如 touchesBegan)都能够检测到所有路径。此外,我也可以在缩放后在视图中滚动,并且效果很好。

*现在的问题是:

  • 每当我放大/缩小时,CAShapeLayer(s) 都会被很好地缩放,但似乎(路径的原始坐标)没有被缩放,或者至少这是我所相信的。我这样说是因为当我单击 CAShapeLayer(s) 时,它们没有响应,但是当我单击它们的原始位置或靠近 CAShapeLayer 显示的位置时,我得到 CAShapeLayer 响应。

  • 我试图将所有 CAShapeLayer(s) 放入一个数组中,从视图中删除它们,然后再次添加它们,但没有改变任何东西。我还尝试了其他东西,例如尝试通过将 CAShapeLayer(s) 添加到 UIScrollView 而不是 UIImageView 来单独缩放 CAShapeLayer(s)。然后我得到当前应用的比例并将其应用到所有 CAShapeLayer(s),但这并没有产生好的结果。

- 检查随附的屏幕截图。我希望他们有所帮助。

我希望你能帮助我,在此先感谢。

*缩放图像之前:http: //imageshack.us/photo/my-images/193/beforescaling.jpg/

*缩放后的图像:http: //imageshack.us/photo/my-images/818/afterscaling.jpg/

**编辑:

- 潜在的解决方案:

1- 可能是我需要更新 CAShapeLayer 的 CATransform3DIdentity。但是,我还不知道该怎么做。

2- 可能是我需要使用 CATransform3DTranslate,但我还不知道如何使用它。

4

1 回答 1

2

我想我会在我终于发现之后回答它。对于那些可能像我一样被卡住的人,只需这样做。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{
    for (UITouch *touch in touches) 

    {
          // The [self.view.subviews objectAtIndex:0]] is the view that I want to check whether the CAShapedLayer is touched or not.
          CGPoint touchPoint = [self.view convertPoint:[touch locationInView:self.view] toView:[self.view.subviews objectAtIndex:0]];
    }

}

更多细节:

当滚动视图缩放视图时,它不会更改该视图的内部坐标系,只会更改其外部坐标系。由于在图像视图的内部坐标系中对 CAShapeLayer 进行了命中测试,因此您应该在进行命中测试之前将触摸点转换为该视图的坐标系。

于 2011-08-12T07:28:51.727 回答