以下是我获得的视图,我有一个layer view
,检测到用户触摸,还有一个显示图像的image view
。 layer view
位于image view
之上。 image view
的图像是纵横拟合的。所以,它不会失去这个比例。如果在我的layer view
触摸100, 240
,则它是layer view
坐标,但不是图像的坐标。我想知道如何将layer view
的坐标转换为图像的坐标。在此示例中,图片大小可能为180 * 180,因此layer view
中image
中的坐标为60, 90
。
感谢。
答案 0 :(得分:5)
如果我正确理解了这个问题,你想得到一个当前与图层坐标系有关的点,并将其转换为图像视图的坐标系吗?
在这种情况下,有几种方法可以做到这一点。
最简单的方法是使用convertPoint:fromView:
或convertPoint:toView:
CGPoint imageViewTouchPoint = [layerView convertPoint:touchPoint fromView:imageView];
CGPoint imageViewTouchPoint = [imageView convertPoint:touchPoint toView:layerView];
任何一个都应该工作。
编辑 - 我现在意识到,只有当UIImageView
与UIImage
具有相同的框架时才会这样,因为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);