There have been several discussions regarding how to convert UIView to UIImage, either using view.drawHierarchy(in:)
or view.layer.renderInContext()
. However, even if set the scale to device scale, the result is still in pretty bad resolution. I wonder if there's a way to transform a UIView to UIImage with high resolution and quality?
Asked
Active
Viewed 3,011 times
2

hyouuu
- 2,471
- 2
- 27
- 37
-
1Possible duplicate of [How to capture UIView to UIImage without loss of quality on retina display](https://stackoverflow.com/questions/4334233/how-to-capture-uiview-to-uiimage-without-loss-of-quality-on-retina-display) – Malik Jun 13 '17 at 02:36
-
Thanks, but that is still using the above 2 methods, and the result is still not good :( – hyouuu Jun 13 '17 at 07:02
1 Answers
6
You need to set the correct content scale on each subview.
extension UIView {
func scale(by scale: CGFloat) {
self.contentScaleFactor = scale
for subview in self.subviews {
subview.scale(by: scale)
}
}
func getImage(scale: CGFloat? = nil) -> UIImage {
let newScale = scale ?? UIScreen.main.scale
self.scale(by: newScale)
let format = UIGraphicsImageRendererFormat()
format.scale = newScale
let renderer = UIGraphicsImageRenderer(size: self.bounds.size, format: format)
let image = renderer.image { rendererContext in
self.layer.render(in: rendererContext.cgContext)
}
return image
}
}
To create your image:
let image = yourView.getImage()

Gui Del Frate
- 671
- 1
- 7
- 17
-
-
1I tried this solution but it doesn't work? How did you manage to do it? – Parvez Belim Dec 01 '20 at 13:28