• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 通过缩放将 UIView 定位在 UIImageView 上

[复制链接]
菜鸟教程小白 发表于 2022-12-12 18:14:01 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我问了一个类似的问题 here ,并得到了我接受的答案。我的新问题需要将常规 UIView 放置在 ImageView 上,从而使其他解决方案无法使用。所以,新问题...

UIImageView 上是否有方法告诉我其图像在其边界内的位置?假设我有一张汽车的图像,如下所示:

car with missing wheel

这张图片是 600x243,并且,后轮应该在的位置,有一个 118,144,74,74 (x,y,w,h) 的孔。

我想将汽车图像放置在一个 UIImageView 中,它的大小基于布局是任意的,我想以自然的纵横比查看整辆汽车。所以我将 ImageView 的内容模式设置为 UIViewContentModeScaleAspectFit,效果很好。

例如,这是 267x200 的 imageView 中的汽车:

enter image description here

我认为这样做会将图像从 w=600 缩放到 w=267,或者缩放 267/600=0.445,并且(我认为)这意味着高度从 200 变为 200*0.445=89 .而且我认为这个洞也确实被那个因素放大了

但我想在 ImageView 上方添加一个 UIView(作为同级),这就是我感到困惑的地方。我知道图像大小,我知道 imageView 大小,并且我知道原始图像大小方面的孔框。图片缩放后如何获取孔框?

我尝试过这样的事情:

  1. 确定汽车图像在其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?
    
  2. 确定孔的缩放框架:

    CGFloat holeX = ratio*118;
    CGFloat holeY = yPos + ratio*144;
    CGFloat holeEdge = ratio*74;
    CGRect holeRect = CGRectMake(holeX,holeY,holeEdge,holeEdge);
    
  3. 将holeRect转换为父 View 的坐标系,为UIView兄弟创建框架。

    [parentView convertRect:holeRect fromView:carImageView];
    

但必须有更好的方法。这些计算(如果它们是正确的)仅适用于比汽车更高的汽车 ImageView 。如果 ImageView 更宽,代码需要不同。

我想我可以为更广阔的视野找出逻辑,但它仍然可能是错误的。比如那个yPos计算。文档是否说,对于内容模式 = AspectFit,图像在较大尺寸内居中?我没看到那个地方。

请告诉我有更好的方法,或者,如果没有,是否证明我的想法适用于任意大小的图像、 ImageView 、孔?

谢谢。



Best Answer-推荐答案


非常感谢 @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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap