将点从图像转换为UIImageView点,contentMode-aware
假设我有一个图像(例如1024 x 768像素),它以UIImageView(例如300 x 300像素)显示。 现在,我想将图像中的一个点(例如人的鼻子的位置(x:500,y:600))转换为UIImageView上的相应点,并考虑其contentMode。
如果在UIViewContentModeScaleToFill中修复了contentMode,转换将很容易。 但如果它是UIViewContentModeScaleAspectFit,事情会变得更加复杂。
是否有一种优雅的方式来实现这一目标? 我真的不想为每一个contentMode计算出来(我认为超过10个)。
谢谢!
今天,我有一些空余时间将我的解决方案整合到这个问题并在GitHub上发布: UIImageView-GeometryConversion
它是UIImageView上的一个类别,它提供了将点和从图像转换为视图坐标并尊重所有13种不同内容模式的方法。
希望你喜欢!
那是我的快速解决方案:
- (CGPoint)convertPoint:(CGPoint)sourcePoint fromContentSize:(CGSize)sourceSize { CGPoint targetPoint = sourcePoint; CGSize targetSize = self.bounds.size; CGFloat ratioX = targetSize.width / sourceSize.width; CGFloat ratioY = targetSize.height / sourceSize.height; if (self.contentMode == UIViewContentModeScaleToFill) { targetPoint.x *= ratioX; targetPoint.y *= ratioY; } else if(self.contentMode == UIViewContentModeScaleAspectFit) { CGFloat scale = MIN(ratioX, ratioY); targetPoint.x *= scale; targetPoint.y *= scale; targetPoint.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetPoint.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; } else if(self.contentMode == UIViewContentModeScaleAspectFill) { CGFloat scale = MAX(ratioX, ratioY); targetPoint.x *= scale; targetPoint.y *= scale; targetPoint.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetPoint.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; } return targetPoint; } - (CGRect)convertRect:(CGRect)sourceRect fromContentSize:(CGSize)sourceSize { CGRect targetRect = sourceRect; CGSize targetSize = self.bounds.size; CGFloat ratioX = targetSize.width / sourceSize.width; CGFloat ratioY = targetSize.height / sourceSize.height; if (self.contentMode == UIViewContentModeScaleToFill) { targetRect.origin.x *= ratioX; targetRect.origin.y *= ratioY; targetRect.size.width *= ratioX; targetRect.size.height *= ratioY; } else if(self.contentMode == UIViewContentModeScaleAspectFit) { CGFloat scale = MIN(ratioX, ratioY); targetRect.origin.x *= scale; targetRect.origin.y *= scale; targetRect.origin.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetRect.origin.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; targetRect.size.width *= scale; targetRect.size.height *= scale; } else if(self.contentMode == UIViewContentModeScaleAspectFill) { CGFloat scale = MAX(ratioX, ratioY); targetRect.origin.x *= scale; targetRect.origin.y *= scale; targetRect.origin.x += (self.frame.size.width - sourceSize.width * scale) / 2.0f; targetRect.origin.y += (self.frame.size.height - sourceSize.height * scale) / 2.0f; targetRect.size.width *= scale; targetRect.size.height *= scale; } return targetRect; }
当它被重构和优化时,我将在github上发布它并在此处发布链接。 也许甚至那个片段对某人也有帮助。
不,没有内置,公共或优雅的方式来做到这一点。
您需要对自己需要的内容模式的function进行反向工程。
为什么你不能重新缩放坐标:
X(UIImageView)=(X(图像)/ 1024)* 300
和
Y(UIImageView)=(Y(图像)/ 768)* 300
- 从plist获取数据到NSMutableArray并将NSMutableArray写入同一个plist iPhone
- 单按和长按事件的UIButton迅速
- 使用AVCaptureStillImageOutput有什么办法来缩短镜头间的时间吗?
- UITableViewCell重用和图像重新渲染
- IOS 8键盘高度和主要作用
- 以编程方式更改ABAddressBook中的链接联系人数组,ABPersonCopyArrayOfAllLinkedPeople
- 如何从事务队列中删除非常旧的,已停止使用的应用内购买
- Objective-C中Singleton的替代scheme,用于更好的应用程序devise
- Xcode复制包资源无法find文件