将 SwiftUI 视图转换为 NSImage

Posted

技术标签:

【中文标题】将 SwiftUI 视图转换为 NSImage【英文标题】:Convert SwiftUI View to NSImage 【发布时间】:2021-09-24 11:51:40 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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,图像有不想要的插入,这可以解决它。

【讨论】:

感激不尽***.com/a/69977253/1610473

以上是关于将 SwiftUI 视图转换为 NSImage的主要内容,如果未能解决你的问题,请参考以下文章

为 Swiftui 视图转换 @State 的计算属性

将 SwiftUI 中的文本与背景属性相结合会产生错误,因为无法将“某些视图”类型的值转换为预期的参数类型“文本”?

使用 SwiftUI 从转换目的地返回时,我想将显示的列表更新为最新状态

将 SwiftUI 视图渲染到屏幕外并将视图另存为 UIImage 以共享

将 AppKit/UIKit 中的 Key-Value Observation 转换为 Combine 和 SwiftUI

SwiftUI 如何获取自定义幻灯片转换的视图大小?