如何从UIImageView的scaleAspectFit模式的UIImage拍摄快照?

时间:2018-05-03 07:13:46

标签: swift uiimageview uiimage

我在UIImageView

中有一张图片
imageView.contentMode = .scaleAspectFit        
imageView.backgroundColor = .red

因为.scaleAspectFit图片视图有一些红色边框,那就OK:

imageView with .scaleAspectFit image

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

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
}

问题是finalImage仍有来自imageView的红色边框。

1 个答案:

答案 0 :(得分:1)

您可以在CGRect内容模式下的UIImage中显示UIImageView AspectFit。请像这样创建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的适当范围调用函数。

如有任何疑问,请与我联系。

<强>更新

请尝试此UIImageView+Extension,这可能会对您有所帮助。它是在Objective-C代码中,在Swift中转换它。

你也可以试试这个,

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

上面的代码可以很好地为您提供尺寸。