在XCTest中截取SwiftUI视图的屏幕截图



我希望能够在XCTest中拍摄SwiftUI视图的屏幕截图

我尝试过类似swifts扩展的破解:https://www.hackingwithswift.com/quick-start/swiftui/how-to-convert-a-swiftui-view-to-an-image

然而,我的用例略有不同,我需要它在XCTest中运行。我也看过pointfreeco快照测试,但是,我想了解为什么我所写的内容只会产生黑色或空图像。

我试过在循环过程中使用displayLink进行屏幕截图,但图像仍然是空的。我觉得我错过了一些基本的东西。

有人能帮忙吗?谢谢

import SwiftUI
import XCTest
final class MyTests: XCTestCase {
func test_screenshot_view() throws {

let swiftUIView = Button {

} label: {
Text("Hello, World!")
}
.frame(width: 140, height: 56)
let controller = UIHostingController(rootView: swiftUIView)
let window = UIWindow()
window.rootViewController = controller

let view = controller.view
let targetSize = controller.view.intrinsicContentSize
view!.bounds = CGRect(origin: .zero, size: targetSize)
view!.backgroundColor = UIColor.yellow

UIGraphicsBeginImageContextWithOptions(view!.bounds.size, view!.isOpaque, 0)
view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
let snapshotImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
//snapshotImage is either black or empty
}
}

只是一个更新,这似乎有效,但有一些大小问题:

import SwiftUI
import CoreGraphics
extension View {

func asImage() -> UIImage {

let controller = UIHostingController(rootView: self)
let view = controller.view
let targetSize = controller.view.intrinsicContentSize
let bounds = CGRect(origin: .zero, size: targetSize)

let window = UIWindow(frame: bounds)

window.rootViewController = controller
window.makeKeyAndVisible()

view?.bounds = bounds
view?.backgroundColor = .clear

let image = controller.view.asImage()

return image
}
}
extension UIView {
func asImage() -> UIImage {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
}
}

最新更新