How to save a layered image using a extension function

前端 未结 1 964
栀梦
栀梦 2021-01-26 06:23

I am using a extension function to save a uiview as a uiimage. The code works to save the uiimage. However what I am trying to do is save a transparent image over the image bein

相关标签:
1条回答
  • 2021-01-26 07:25

    Here is a UIView extension that takes in CGRect and UIImage, and alternitavely you can also supply it another CGRect or CGSize to make it more dynamic for the watermark placement/size

    extension UIView {        
        /// Takes a screenshot of a UIView, with an option to clip to view bounds and place a waterwark image 
        /// - Parameter rect: offset and size of the screenshot to take
        /// - Parameter clipToBounds: Bool to check where self.bounds and rect intersect and adjust size so there is no empty space
        /// - Parameter watermark: UIImage of the watermark to place on top
        func screenshot(for rect: CGRect, clipToBounds: Bool = true, with watermark: UIImage? = nil) -> UIImage {
            var imageRect = rect
            if clipToBounds {
                imageRect = bounds.intersection(rect)
            }
            return UIGraphicsImageRenderer(bounds: imageRect).image { _ in
            drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
            watermark?.draw(in: CGRect(origin: imageRect.origin, size: CGSize(width: 32, height: 32))) // update origin to place watermark where you want, with this update it will place it in top left or screenshot.
            }
        }
    }
    

    You can call it like so:

    let image = self.view.screenshot(for: CGRect(x: 0, y: 0, width: 200, height: 200), with: UIImage(named: "star"))
    

    This will work for all subviews of the view that calls screenshot(...)

    For a anyone using the above extension, I added additional info in this answer

    0 讨论(0)
提交回复
热议问题