如何在 UIImageView 中获取 UIImage 的 x 和 y 位置?
How to get x and y position of UIImage in UIImageView?
当我们使用 scaleAspectFill 在 UIImageView 中设置它时,我想获得 UIImage 的原始 x 和 y 位置。
正如我们在 scaleAspectFill 中所知道的,一些部分被剪裁了。因此,根据我的要求,我想获得 x 和 y 值(可能是 - 我不知道的值。)。
这是图库中的原始图片
现在我将上面的图片设置为我的应用程序视图。
所以像上面的情况,我想得到它被剪裁的图像的隐藏x,y位置。
谁能告诉我如何得到它?
如果您想像画廊中那样显示图像,则可以使用约束
"H:|[v0]|" 和 "V:|[v0]|" 以及在图像视图中使用 .aspectFit
如果你想要图像大小,你可以使用 imageView.image!.size 并计算被剪切的图像量。在 aspectFill 中,宽度与屏幕宽度匹配,因此高度会增加。所以我想你可以找到有多少图像被剪切了。
使用以下扩展
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)
UI 测试
let testView = UIView(frame: rect)
testView.backgroundColor = UIColor.red.withAlphaComponent(0.5)
imageView.superview?.addSubview(testView)
使用下面的扩展来找出 ImageView 中图像的准确细节。
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)
当我们使用 scaleAspectFill 在 UIImageView 中设置它时,我想获得 UIImage 的原始 x 和 y 位置。
正如我们在 scaleAspectFill 中所知道的,一些部分被剪裁了。因此,根据我的要求,我想获得 x 和 y 值(可能是 - 我不知道的值。)。
这是图库中的原始图片
现在我将上面的图片设置为我的应用程序视图。
所以像上面的情况,我想得到它被剪裁的图像的隐藏x,y位置。
谁能告诉我如何得到它?
如果您想像画廊中那样显示图像,则可以使用约束 "H:|[v0]|" 和 "V:|[v0]|" 以及在图像视图中使用 .aspectFit
如果你想要图像大小,你可以使用 imageView.image!.size 并计算被剪切的图像量。在 aspectFill 中,宽度与屏幕宽度匹配,因此高度会增加。所以我想你可以找到有多少图像被剪切了。
使用以下扩展
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)
UI 测试
let testView = UIView(frame: rect)
testView.backgroundColor = UIColor.red.withAlphaComponent(0.5)
imageView.superview?.addSubview(testView)
使用下面的扩展来找出 ImageView 中图像的准确细节。
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)