我问了一个类似的问题 here ,并得到了我接受的答案。我的新问题需要将常规 UIView
放置在 ImageView 上,从而使其他解决方案无法使用。所以,新问题...
UIImageView
上是否有方法告诉我其图像在其边界内的位置?假设我有一张汽车的图像,如下所示:
这张图片是 600x243,并且,后轮应该在的位置,有一个 118,144,74,74 (x,y,w,h) 的孔。
我想将汽车图像放置在一个 UIImageView
中,它的大小基于布局是任意的,我想以自然的纵横比查看整辆汽车。所以我将 ImageView 的内容模式设置为 UIViewContentModeScaleAspectFit
,效果很好。
例如,这是 267x200 的 imageView 中的汽车:
我认为这样做会将图像从 w=600 缩放到 w=267,或者缩放 267/600=0.445,并且(我认为)这意味着高度从 200 变为 200*0.445=89 .而且我认为这个洞也确实被那个因素放大了
但我想在 ImageView 上方添加一个 UIView
(作为同级),这就是我感到困惑的地方。我知道图像大小,我知道 imageView 大小,并且我知道原始图像大小方面的孔框。图片缩放后如何获取孔框?
我尝试过这样的事情:
确定汽车图像在其UIImageView
中的位置。是这样的:
float ratio=carImage.width/carImageView.frame.size.width; // 0.445
CGFloat yPos=(carImageView.frame.size.height-carImage.height)/2; // there should be a method for this?
确定孔的缩放框架:
CGFloat holeX = ratio*118;
CGFloat holeY = yPos + ratio*144;
CGFloat holeEdge = ratio*74;
CGRect holeRect = CGRectMake(holeX,holeY,holeEdge,holeEdge);
将holeRect转换为父 View 的坐标系,为UIView兄弟创建框架。
[parentView convertRect:holeRect fromView:carImageView];
但必须有更好的方法。这些计算(如果它们是正确的)仅适用于比汽车更高的汽车 ImageView 。如果 ImageView 更宽,代码需要不同。
我想我可以为更广阔的视野找出逻辑,但它仍然可能是错误的。比如那个yPos
计算。文档是否说,对于内容模式 = AspectFit,图像在较大尺寸内居中?我没看到那个地方。
请告诉我有更好的方法,或者,如果没有,是否证明我的想法适用于任意大小的图像、 ImageView 、孔?
谢谢。
非常感谢 @originaluser2 帮助我解决这个问题。事实证明,AVFoundation 库中有一个可用的单行代码:
// given an imageView and an image
CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(image.size, imageView.bounds);
imageRect
将作为图像在 imageView 坐标系中占据的矩形结束(因为我们通过了边界;通过框架将在父坐标系中解决)。
对于我的问题,我现在可以根据以下方式缩放孔矩形:
CGFloat scaleX = image.size.width / imageView.bounds.size.width;
CGFloat scaleY = image.size.height / imageView.bounds.size.height;
既然我有了imageRect的原点,那么难的部分就完成了,直接加上吧:
CGFloat scaledOriginX = holeX*scaleX + imageRect.origin.x;
CGFloat scaledOriginY = holeY*scaleY + imageRect.origin.y;
当然,还可以缩放洞的宽度和高度:
CGFloat scaledWidth = holeWidth*scaleX;
CGFloat scaledHeight = holeHeight*scaleY;
这就是完整的、更正的矩形。
关于ios - 通过缩放将 UIView 定位在 UIImageView 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34893198/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |