Преобразование представления SwiftUI в UIImage
Я могу преобразовать любой SwiftUI View в UIImage с высоким разрешением, используя приведенный ниже код. Он отлично работает... пока... я пытаюсь использовать размер изображения больше, чем CGSize(ширина: 2730, высота: 2730).
Если я увеличу размер изображения до CGSize(ширина: 2731, высота: 2731) или больше, строка:
self.drawHierarchy(in: self.layer.bounds, afterScreenUpdates: true)
в расширении UIView больше не может рисовать UIImage.
Есть идеи, почему существует ограничение по размеру?
// 1: Set breakpoint on line: print("done") to inspect the high res image
// 2: Run, then tap the image on screen to inspect the highresImage
// 3: repeat after changing the size to CGSize = CGSize(width: 2731, height: 2731)
import SwiftUI
struct ContentView: View {
@State var blurRadius: CGFloat = 4.0
let imageSize: CGSize = CGSize(width: 2730, height: 2730)
var body: some View {
testView
.frame(width: 300, height: 300)
.onTapGesture {
// Adjust blur radius based on high res image scale
blurRadius *= imageSize.width * 0.5/300
// Capture high res image of swiftUI view
let highresImage = testView.asImage(size: imageSize)
// set breakpoint here to inspect the high res image size, quality, etc.
print("done")
// reset blur radius back to 4
blurRadius = 4
}
}
var testView: some View {
ZStack {
Color.blue
Circle()
.fill(Color.red)
}
.blur(radius: blurRadius)
}
}
extension UIView {
func asImage() -> UIImage {
let format = UIGraphicsImageRendererFormat()
format.scale = 1
return UIGraphicsImageRenderer(size: self.layer.frame.size, format: format).image { context in
self.drawHierarchy(in: self.layer.bounds, afterScreenUpdates: true)
}
}
}
extension View {
func asImage(size: CGSize) -> UIImage {
let controller = UIHostingController(rootView: self)
controller.view.bounds = CGRect(origin: .zero, size: size)
let image = controller.view.asImage()
return image
}
}
1 ответ
Я не могу понять, почему, но это работает для меня после изменения координаты y источника представления на что-либо отличное от нуля. Это может быть ошибка в
UIHostingController
.
Если вы используете очень маленький
Int
, вы не видите разницы, например:
controller.view.bounds = CGRect(origin: CGPoint(x: 0, y: 0.0001), size: size)