【发布时间】:2021-11-01 04:20:34
【问题描述】:
我尝试使用来自HWS: How to convert a SwiftUI view to an image 的代码从 SwiftUI 视图创建一个 UIImage,一个快照。
我得到以下结果,这显然是不正确的,因为图像被截断了。
代码:
struct ContentView: View {
@State private var savedImage: UIImage?
var textView: some View {
Text("Hello, SwiftUI")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.clipShape(Capsule())
}
var body: some View {
ZStack {
VStack(spacing: 100) {
textView
Button("Save to image") {
savedImage = textView.snapshot()
}
}
if let savedImage = savedImage {
Image(uiImage: savedImage)
.border(Color.red)
}
}
}
}
extension View {
func snapshot() -> UIImage {
let controller = UIHostingController(rootView: self)
let view = controller.view
let targetSize = controller.view.intrinsicContentSize
view?.bounds = CGRect(origin: .zero, size: targetSize)
view?.backgroundColor = .clear
let renderer = UIGraphicsImageRenderer(size: targetSize)
return renderer.image { _ in
view?.drawHierarchy(in: controller.view.bounds, afterScreenUpdates: true)
}
}
}
看起来作为快照的原始视图低于应有的水平,但我不确定。我该如何解决这个问题?
编辑
我们发现这个问题在 iOS 14 上不会出现,只有在 iOS 15 上才会出现。所以问题是......如何在 iOS 15 上解决这个问题?
【问题讨论】:
-
那是因为你在那里使用ZStack!图像将自己置于所有视图之上!
-
@swiftPunk 我知道它位于所有视图之上。但是为什么快照从正确的位置偏移?红色矩形勾勒出它应该填充的位置。
-
对我来说很好用(iPhone 12、iOS 14.5)。也许试试
.resizable().aspectRatio(contentMode: .fit)? -
@George:对我来说也很好用!看:i.stack.imgur.com/xYrlR.png
-
我刚刚向 Apple 发送反馈问题 ID:FB9666959
标签: ios swift swiftui uiimage ios15