gpt4 book ai didi

ios - SwiftUI View 的快照被部分截断

转载 作者:行者123 更新时间:2023-12-05 00:23:40 30 4
gpt4 key购买 nike

我试图创建一个 UIImage来自 SwiftUI View ,快照,代码来自 HWS: How to convert a SwiftUI view to an image .
我得到以下结果,这显然是不正确的,因为图像被截断了。
Result
代码:

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)
}
}
}
看起来快照的原始 View 低于应有的水平,但我不确定。我该如何解决?

编辑
我们发现这个问题不会在 iOS 14 上出现,只有 iOS 15。所以问题是......如何在 iOS 15 上解决这个问题?

最佳答案

我最近也注意到了这个问题。我在不同的模拟器(例如,iPhone 8 和 iPhone 13 Pro)上进行了测试,发现偏移量似乎总是状态栏高度的一半。所以我怀疑当你调用 drawHierarchy(in:afterScreenUpdates:) , 在内部 SwiftUI 总是考虑安全区域插入。
因此,我修改了snapshot()在您的 View 中使用使用 edgesIgnoringSafeArea(_:) 进行扩展 View 修饰符,它起作用了:

extension View {
func snapshot() -> UIImage {
let controller = UIHostingController(rootView: self.edgesIgnoringSafeArea(.all))
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 - SwiftUI View 的快照被部分截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69034515/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com