Swift 如何从ScaleSpectFit模式下的UIImageView的UIImage拍摄快照?

Swift 如何从ScaleSpectFit模式下的UIImageView的UIImage拍摄快照?,swift,uiimageview,uiimage,Swift,Uiimageview,Uiimage,我在UIImageView中有一个图像: 由于.scaleAspectFit,图像视图有一些红色边框,这没关系: 用户可以在imageView上添加一些类似UIView的标签或图像。 在最后一步中,我使用以下代码保存编辑的图像,用户可以共享该图像或将其保存到照片库: private func generateImage() -> UIImage? { var finalImage: UIImage? UIGraphicsBeginImageContextWithOption

我在UIImageView中有一个图像:

由于.scaleAspectFit,图像视图有一些红色边框,这没关系:

用户可以在imageView上添加一些类似UIView的标签或图像。 在最后一步中,我使用以下代码保存编辑的图像,用户可以共享该图像或将其保存到照片库:

private func generateImage() -> UIImage? {
    var finalImage: UIImage?
    UIGraphicsBeginImageContextWithOptions(CGSize(width: imageView.frame.size.width, height: imageView.frame.size.height), true, 0)
    imageView.drawHierarchy(in: CGRect(x: 0, y: 0, width: imageView.frame.size.width, height: imageView.frame.size.height), afterScreenUpdates: true)
    finalImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}
问题是最终图像仍然有来自imageView的红色边框。

您可以在AspectFit内容模式下获得UIImageView中显示的UIImage的CGRect。请像这样创建UIImageView的扩展

extension UIImageView {
    var contentClippingRect: 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)
    }
}
现在,您可以使用imageView.contentClippingRect读取如何读取内部图像的位置和大小

您必须在方法中做一些小的更改,调用具有适当边界的函数作为contentClippingRect

如果有任何疑问,请告诉我

更新

请试试这个,这个可能对你有帮助。它是Objective-C代码,请用Swift转换

你也可以试试这个

    let image  = #imageLiteral(resourceName: "Cat03")
    let x: CGRect = AVMakeRect(aspectRatio: image.size, insideRect: imageView1.frame)
    print(x)

上面的代码为您提供了完美的尺寸。

为什么不简单地查询imageView.image?你需要将图像调整到图像视图的大小吗?@DarkDust,你是什么意思?使用imageView.image.size作为drawHierarchy CGRect?我不明白你想做什么。您有一个图像视图显示和显示图像,并且您似乎希望在该图像视图中保存图像,但没有红色边框。对吗?如果是这样,为什么不简单地将图像保存在imageView.image中?@DarkDust,正确。因为用户可以在ImageView上添加一些UILabel和另一个UIImageView。所以最终的图像是一些图像和标签在图像上的混合。我尝试了这个扩展,我从hackingwithswift.com得到的,但没有帮助。请给我一些时间,将由AVMakeRect完成。我创建了图像大小并处理其余的问题。谢谢,错配原点位置
    let image  = #imageLiteral(resourceName: "Cat03")
    let x: CGRect = AVMakeRect(aspectRatio: image.size, insideRect: imageView1.frame)
    print(x)