【发布时间】:2021-09-24 11:51:40
【问题描述】:
如何创建 SwiftUI View 扩展以返回 NSImage?我已经看到如何在 iOS 上使用 UIGraphicsImageRenderer 完成它,但似乎没有 macOS 等效项。
【问题讨论】:
如何创建 SwiftUI View 扩展以返回 NSImage?我已经看到如何在 iOS 上使用 UIGraphicsImageRenderer 完成它,但似乎没有 macOS 等效项。
【问题讨论】:
View+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
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,图像有不想要的插入,这可以解决它。
【讨论】: