如何创建一个SwiftUI View
扩展来返回一个 NSImage
?我已经看到了在iOS上使用 UIGraphicsImageRenderer
进行操作的方法,但似乎在macOS上不存在相应的解决方案。
查看+Image.swift
import SwiftUI
extension View {
func renderAsImage() -> NSImage? {
let view = NoInsetHostingView(rootView: self)
view.setFrameSize(view.fittingSize)
return view.bitmapImage()
}
}
NoInsetHostingView.swift
import SwiftUI
class NoInsetHostingView<V>: NSHostingView<V> where V: View {
override var safeAreaInsets: NSEdgeInsets {
return .init()
}
}
NSView+Image.swift
->NSView+Image.swift
public extension NSView {
func bitmapImage() -> NSImage? {
guard let rep = bitmapImageRepForCachingDisplay(in: bounds) else {
return nil
}
cacheDisplay(in: bounds, to: rep)
guard let cgImage = rep.cgImage else {
return nil
}
return NSImage(cgImage: cgImage, size: bounds.size)
}
}
我不确定为什么需要NoInsetHostingView
,但是如果只使用普通的NSHostingView
,图像会有不必要的内嵌,这样可以解决问题。