SwiftUI 在 preview 界面进行截图

方法一

直接在 #Preview 中呼叫。点击三下后即可完成截图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import SwiftUI

struct PreviewScreenshotModifier: ViewModifier {
let screenshotDirectoryURL = URL(filePath: "/Users/wonderhoi/")
let tapCount = 3

func body(content: Content) -> some View {
content
.onTapGesture(count: tapCount, perform: {
let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
let window = scene?.keyWindow ?? UIWindow(frame: .zero)
let renderer = UIGraphicsImageRenderer(size: window.bounds.size)
let image = renderer.image { context in
window.drawHierarchy(in: window.bounds, afterScreenUpdates: true)
}
let pngData = image.pngData()
let screenshotURL = screenshotDirectoryURL.appending(path: "\(UUID())").appendingPathExtension(for: .png)
try? image.pngData()?.write(to: screenshotURL)
})
}
}

extension View {
func previewScreenshot() -> some View {
modifier(PreviewScreenshotModifier())
}
}

使用

1
2
3
4
#Preview {
ContentView()
.previewScreenshot()
}

方法二

通过按钮或者 onTap 等手势触发。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Button(action: {

let screenshotDirectoryURL = URL(filePath: "/Users/wonderhoi/")
let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
let window = scene?.keyWindow ?? UIWindow(frame: .zero)
let renderer = UIGraphicsImageRenderer(size: window.bounds.size)
let image = renderer.image { context in
window.drawHierarchy(in: window.bounds, afterScreenUpdates: true)
}
let pngData = image.pngData()
let screenshotURL = screenshotDirectoryURL.appending(path: "\(UUID())").appendingPathExtension(for: .png)
try? image.pngData()?.write(to: screenshotURL)

}, label: {
Text("截屏")
})

SwiftUI 在 preview 界面进行截图
https://wonderhoi.com/2025/06/25/SwiftUI-在-preview-界面进行截图/
作者
wonderhoi
发布于
2025年6月25日
许可协议