2

这是我得到的视图,我得到了一个layer view,检测用户触摸和一个image view,它显示了图像。是盖layer viewimage view. 的image view图像是宽高比合适的。所以,它不会失去比例。如果在我的layer view触摸中100, 240,它是一个layer view坐标,但不是图像的坐标。我想知道如何将layer view' 坐标转换为图像坐标。在这个例子中,图像大小可能是 180*180,所以, 中的layer view坐标image60, 90

谢谢。在此处输入图像描述

4

2 回答 2

5

如果我正确理解了这个问题,您想取一个当前与图层坐标系相关的点,并将其转换为图像视图的坐标系?

在这种情况下,有几种方法可以做到这一点。

最简单的方法是使用convertPoint:fromView:convertPoint:toView:

CGPoint imageViewTouchPoint = [layerView convertPoint:touchPoint fromView:imageView];

CGPoint imageViewTouchPoint = [imageView convertPoint:touchPoint toView:layerView];

任何一个都应该工作。

编辑- 我现在意识到,这只是当 与UIImageView具有相同的框架时UIImage,你说它可能不是,由于UIViewContentModeScaleAspectFit属性。

在这种情况下,除非我弄错了,否则图像帧是在UIImageView drawRect:方法内部计算的,而不是被设置的属性。这意味着您必须自己计算。

绝对imageViewTouchPoint从上述方法之一中获取(以防万一您想在UIImageView不是全屏尺寸的 a 上使用相同的逻辑)。

然后,您将需要计算缩放的图像帧。有几种方法可以做到这一点。有些人会蛮力并根据图像的哪一侧较长手动计算,然后确定应该缩放哪一侧。然后他们通过将图像居中并减去图像和图像视图的边并除以二来计算原点。

如果没有必要,我喜欢尽可能少地编写代码,即使这意味着要导入一个框架。如果您导入AVFoundation,您将获得一种方法AVMakeRectWithAspectRatioInsideRect,您可以使用该方法在一行代码中实际计算缩放的矩形。

CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame);

无论您使用哪种方法,您都将简单地将您的触摸点与缩放的图像原点平移:

CGPoint imageTouchPoint = CGPointMake(imageViewTouchPoint.x - imageRect.origin.x, imageViewTouchPoint.y - imageRect.origin.y);

于 2013-07-28T07:54:55.937 回答
0

你必须自己做数学。计算图像的纵横比并与图像视图边界的纵横比进行比较。

看这个问题:How to Get Image position in ImageView

在搜索了更多之后,得到了一个 hack:

CGSize imageInViewSize = [photo resizedImageWithContentMode:UIViewContentModeScaleAspectFit bounds:imageView.size interpolationQuality:kCGInterpolationNone].size;


CGRect overlayRect = CGRectMake((imageView.frame.size.width - imageInViewSize.width) / 2,
                                        (imageView.frame.size.height - imageInViewSize.height) / 2, 
                                        imageInViewSize.width, 
                                        imageInViewSize.height);

NSLog(@"Frame of Image inside UIImageView: Left:%f Top:%f Width:%f Height:%f \n", overlayRect.origin.x, overlayRect.origin.y, overlayRect.size.width, overlayRect.size.height);
于 2013-07-28T09:05:00.100 回答