swift - 将 SwiftUI 视图转换为 NSImage
问题描述
如何创建 SwiftUIView
扩展以返回NSImage
? 我已经看到如何在 iOS 上使用它来完成UIGraphicsImageRenderer
它,但似乎没有 macOS 等价物。
解决方案
查看+图片.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
的图像有不需要的插图,这可以解决它。
推荐阅读
- ios - Swift - Locksmith loadDataForUserAccount 有时会失败?
- java - recyclerview 的 notifyItemInserted 插入错误的位置
- dask - 如何在 Dask 中为 GroupBy 添加自定义聚合函数?例如平均值、众数、中位数、第 95 个百分位数等
- flutter - centerTitle 和 TextAlign.centre 有什么区别?
- java - 图像加载和上传到 Firebase 存储无法在 android 和 firebase 控制台中显示“错误加载预览”
- c - 用于在 C 中打印 uknown 大小的二维数组的函数
- alexa-skill - 带有 Jovo 框架的 Alexa 语音:这可以通过话语获得 IntentName 吗?如何根据用户话语决定跳转到哪个意图?
- angular - primeng 树,p-tree 默认扩展和选择节点,突出显示不起作用
- angular - 在一个地方导入所有文件时,sass 变量在 Ionic-4 中不起作用
- javascript - 结帐条纹上的空白图片