如何在 UIImageView 中获取 UIImage 的 x 和 y 位置?

Posted

技术标签:

【中文标题】如何在 UIImageView 中获取 UIImage 的 x 和 y 位置?【英文标题】:How to get x and y position of UIImage in UIImageView? 【发布时间】:2019-05-20 07:26:05 【问题描述】:

当我们使用 scaleAspectFill 在 UIImageView 中设置 UIImage 时,我想获得它的原始 x 和 y 位置。

正如我们在 scaleAspectFill 中所知道的,某些部分被剪裁了。因此,根据我的要求,我想获得 x 和 y 值(可能是 - 我不知道的值。)。

这是来自画廊的原始图片

现在我将上面的图像设置到我的应用视图中。

所以在上述情况下,我想得到它被剪裁的图像的隐藏 x、y 位置。

谁能告诉我如何获得它?

【问题讨论】:

【参考方案1】:

使用下面的扩展来查找 ImageView 中 Image 的准确详细信息。

extension UIImageView 
    var contentRect: CGRect 
        guard let image = image else  return bounds 
        guard contentMode == .scaleAspectFit else  return bounds 
        guard image.size.width > 0 && image.size.height > 0 else  return bounds 

        let scale: CGFloat
        if image.size.width > image.size.height 
            scale = bounds.width / image.size.width
         else 
            scale = bounds.height / image.size.height
        

        let size = CGSize(width: image.size.width * scale, height: image.size.height * scale)
        let x = (bounds.width - size.width) / 2.0
        let y = (bounds.height - size.height) / 2.0

        return CGRect(x: x, y: y, width: size.width, height: size.height)
    

如何测试

let rect = imgTest.contentRect
print("Image rect:", rect)

【讨论】:

【参考方案2】:

使用以下扩展名

extension UIImageView 

    var imageRect: CGRect 
        guard let imageSize = self.image?.size else  return self.frame 

        let scale = UIScreen.main.scale

        let imageWidth = (imageSize.width / scale).rounded()
        let frameWidth = self.frame.width.rounded()

        let imageHeight = (imageSize.height / scale).rounded()
        let frameHeight = self.frame.height.rounded()

        let ratio = max(frameWidth / imageWidth, frameHeight / imageHeight)
        let newSize = CGSize(width: imageWidth * ratio, height: imageHeight * ratio)
        let newOrigin = CGPoint(x: self.center.x - (newSize.width / 2), y: self.center.y - (newSize.height / 2))
        return CGRect(origin: newOrigin, size: newSize)
    


用法

let rect = imageView.imageRect
print(rect)

界面测试

let testView = UIView(frame: rect)
testView.backgroundColor = UIColor.red.withAlphaComponent(0.5)
imageView.superview?.addSubview(testView)

【讨论】:

【参考方案3】:

如果您想像在画廊中一样显示图像,那么您可以使用约束 “H:|[v0]|”和“V:|[v0]|”并在 imageview 中使用 .aspectFit

如果您想要图像大小,您可以使用 imageView.image!.size 并计算被剪切的图像数量。在 aspectFill 中,宽度与屏幕宽度匹配,因此高度会增加。所以我想你可以找到有多少图像被剪切了。

【讨论】:

以上是关于如何在 UIImageView 中获取 UIImage 的 x 和 y 位置?的主要内容,如果未能解决你的问题,请参考以下文章

将图像检索到我的 UIImageView

将 UIImageView 与 contentMode AspectFill 和顶部对齐

将 UIImageView 添加到 UIButton

在 iOs 中调用按钮 setBackgroundImage 后 UIImageView 位置发生变化

.AllowUserInteraction 不适用于 UIImageView

使用 CGAffineTransform 使用 UIViewContentModeTop 缩放 UIImageView