将 SwiftUI 视图转换为 NSImage

Rom*_*4in 10 macos swift swiftui

如何创建 SwiftUIView扩展来返回NSImage?我已经看到如何在 iOS 上使用它来完成此操作UIGraphicsImageRenderer,但似乎没有 macOS 等效项。

Osk*_*kar 15

视图+图像.swift

import SwiftUI

extension View {
    
    func renderAsImage() -> NSImage? {
        let view = NoInsetHostingView(rootView: self)
        view.setFrameSize(view.fittingSize)
        return view.bitmapImage()
    }

}
Run Code Online (Sandbox Code Playgroud)

NoInsetHostingView.swift

import SwiftUI

class NoInsetHostingView<V>: NSHostingView<V> where V: View {
    
    override var safeAreaInsets: NSEdgeInsets {
        return .init()
    }
    
}
Run Code Online (Sandbox Code Playgroud)

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)
    }
    
}
Run Code Online (Sandbox Code Playgroud)

我不确定到底为什么NoInsetHostingView需要,但只要是正常的NSHostingView图像就有不需要的插图,这可以修复它。