如何使用UIBezeir路径获取用于绘图的视图(图纸视图)的屏幕截图

时间:2018-03-30 05:01:33

标签: ios swift xcode layer uibezierpath

我有一个滚动视图上的绘图视图。绘图完成后,我需要一张图纸的截图,我将上传到服务器。

我正在使用UIBezeir路径在视图上绘制。

let path = UIBezierPath()

     for i in self.drawView.path{

            path.append(i)

        }

self.drawView.path是一个NSArray,包含绘图的所有bezeir路径。

但是,当我使用此路径的边界框并获取坐标的最大值和最小值并尝试捕获屏幕截图时,我得到了这个

var rect:CGRect = CGRect(x: path.bounds.minX, y: path.bounds.minY, width: path.bounds.maxX, height: path.bounds.maxY)

enter image description here

我也试图给出路径本身的界限

let rect:CGRect = CGRect(x: path.bounds.origin.x - 5, y: path.bounds.origin.y - 5, width: path.bounds.size.width + 5, height: path.bounds.size.height + 5)

仅供参考我尝试使用此rect并创建一个视图(带边框图层的清晰颜色)并将其放在Drawing上,它工作得很好但是当我尝试捕获图像时它超出了界限{{3} }

这是我用来捕捉屏幕的功能

func imgScreenShot(bounds:CGRect) -> UIImage{

        let rect: CGRect = bounds
        self.drawView.isOpaque = false
        self.drawView.backgroundColor = UIColor.clear
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        var context: CGContext? = UIGraphicsGetCurrentContext()
        if let aContext = context {
            self.drawView.layer.render(in: aContext)
        }
        var capturedImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        //let finalImage = scaleImage(image: capturedImage)

        return capturedImage!


    }

我也尝试使用此功能获取UIView

let vw = self.drawView.resizableSnapshotView(from: rect, afterScreenUpdates: true, withCapInsets: UIEdgeInsets.zero)

这给了我一个完美的UIView图纸,但是当我尝试使用给出视图边界的函数将UIView转换为UIImage时,我得到一个空白图像。

任何人都可以建议我做错了什么或任何其他解决方案,我怎么能得到这个,图像的边界恰好在图纸的边界开始

let vw = self.drawView.resizableSnapshotView(from: rect2, afterScreenUpdates: true, withCapInsets: UIEdgeInsets.zero)
            vw?.frame = CGRect(x: 50, y: 50, width: 100, height: 100)
            vw?.layer.borderColor = UIColor.red.cgColor
            vw?.layer.borderWidth = 1
            self.drawView.addSubview(vw!)
            let image = vw?.snapshotImage
            let imgView = UIImageView(frame: CGRect(x: 250, y: 50, width: 100, height: 100))
            imgView.layer.borderColor = UIColor.gray.cgColor
            imgView.layer.borderWidth = 1
            self.drawView.addSubview(imgView)

enter image description here

1 个答案:

答案 0 :(得分:1)

扩展UIView和UIImage ,因此在整个应用程序生命周期中,您可以使用这些方法(我将在下面描述)用于捕获任何特定UIView的屏幕截图并调整现有图像的大小(,如果需要)。

以下是 UIView 扩展: -

extension UIView {

    var snapshotImage : UIImage? {

        var snapShotImage:UIImage?

        UIGraphicsBeginImageContext(self.frame.size)

        if let context = UIGraphicsGetCurrentContext() {

            self.layer.render(in: context)

            if let image = UIGraphicsGetImageFromCurrentImageContext() {
                UIGraphicsEndImageContext()
                snapShotImage = image
            }
        }
        return snapShotImage
    }
}

以下是 UIImage 扩展名: -

extension UIImage {

    func resizeImage(newSize:CGSize) -> UIImage? {

        var newImage:UIImage?

        let horizontalRatio = newSize.width / size.width
        let verticalRatio = newSize.height / size.height

        let ratio = max(horizontalRatio, verticalRatio)

        let newSize = CGSize(width: size.width * ratio, height: size.height * ratio)

        UIGraphicsBeginImageContext(newSize)

        if let _ = UIGraphicsGetCurrentContext() {

            draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))

            if let image = UIGraphicsGetImageFromCurrentImageContext() {

                UIGraphicsEndImageContext()
                newImage = image
            }
        }

        return newImage
    }
}

如何在我们想要的课程中使用这些功能?

if let snapImage = yourUIView.snapshotImage {

            ///... snapImage is the desired image you want and its dataType is `UIImage`.

           ///... Now resize the snapImage into desired size by using this one 

         if let resizableImage = snapImage.resizeImage(newSize: CGSize(width: 150.0, height: 150.0)) {


            print(resizableImage)
        }

        }

这里 yourUIView 表示您为绘制一些输入所采用的那个。它可以是 IBOutlet 以及您的UIView(您已经以编程方式