swift - 将 SwiftUI View 转换为 NSImage

标签 swift macos swiftui

如何创建 SwiftUI View扩展返回 NSImage ?我已经看到如何使用 UIGraphicsImageRenderer 在 iOS 上完成它但似乎没有 macOS 等价物。

最佳答案

View +图像.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图像有不想要的插图,这修复了它。

关于swift - 将 SwiftUI View 转换为 NSImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69314578/

相关文章:

java - 制作 JFrame 时抛出 LWJGL java.awt.HeadlessException

mysql - 当我重新启动 MacBook 时,我的 MySQL root 密码不断重置

Swiftui 渐变制作器 Spacer 无用

Swift 5.1 @propertyWrapper - 'self' 在初始化所有存储的属性之前用于属性访问

SwiftUI:更改基于 NavigationBarTitle 的 TabbedView 标签的更好方法

swift - 如何将 UISearchController 与 SwiftUI 集成

ios - 一段时间后用户默认值更改为以前的值 - Swift

ruby-on-rails - 在 Mac 和 Linux 机器上创建等效的 Rails 工作区

ios - 存储用户凭据 iOS 的推荐方式?

ios - 如何以编程方式调整已经具有约束的 UIButton 的大小?