如何找回iOS上图像的真实位置?

时间:2013-07-28 06:21:05

标签: objective-c uiview uiimageview

以下是我获得的视图,我有一个layer view,检测到用户触摸,还有一个显示图像的image viewlayer view位于image view之上。 image view的图像是纵横拟合的。所以,它不会失去这个比例。如果在我的layer view触摸100, 240,则它是layer view坐标,但不是图像的坐标。我想知道如何将layer view的坐标转换为图像的坐标。在此示例中,图片大小可能为180 * 180,因此layer viewimage中的坐标为60, 90

感谢。enter image description here

2 个答案:

答案 0 :(得分:5)

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

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

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

  

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

     

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

任何一个都应该工作。

编辑 - 我现在意识到,只有当UIImageViewUIImage具有相同的框架时才会这样,因为UIViewContentModeScaleAspectFit可能没有UIImageView 1}}属性。

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

绝对从以上某个方法中获取UIImageView(以防您想在AVFoundation上使用相同的逻辑而不是全屏大小。)

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

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

  

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

无论您使用哪种方法,您都可以使用缩放的图像原点简单地翻译您的触摸点:

  

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

答案 1 :(得分:0)

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

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

经过更多搜索,得到了一个黑客:

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