将SwiftUI视图转换为NSImage。

10

如何创建一个SwiftUI View 扩展来返回一个 NSImage?我已经看到了在iOS上使用 UIGraphicsImageRenderer 进行操作的方法,但似乎在macOS上不存在相应的解决方案。

1个回答

15

查看+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,图像会有不必要的内嵌,这样可以解决问题。


巨大的感激之情 https://dev59.com/Urjoa4cB1Zd3GeqPFdVZ#69977253 - SaganRitual

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接