将 NSView 输出为 png

问题描述 投票:0回答:1

操作系统版本:14.2
XCode 版本:15.2
快速版本:5.9.2
目标:macOS应用程序(cocoa)

我想让 NSView 以编程方式创建为 png,但 bitmapImageRepForCachingDisplay 返回 nil,因为边界是 (0.0, 0.0, 0.0, 0.0)。

我尝试将边界更改为

NSRect(x: 0, y: 0, width: 200, height: 200)
,但 png 是空的。

出了什么问题?

class ViewController: NSViewController {
    var myView: MyView?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.myView = MyView()
        self.view.addSubview(self.myView!)
    }

    @IBAction func buttonClicked(_ sender: Any) {
        self.myView?.makeImage()
    }
}
class MyView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        let context = NSGraphicsContext.current!.cgContext
        context.saveGState()

        context.setStrokeColor(NSColor.red.cgColor)
        context.strokeEllipse(in: NSRect(x: 100, y: 100, width: 50, height: 50))

        context.restoreGState()
    }
}

extension NSView {
    func makeImage() -> Void {
        guard let rep = bitmapImageRepForCachingDisplay(in: bounds) else { return }
        rep.size = bounds.size
        cacheDisplay(in: bounds, to: rep)
        guard let pngData = rep.representation(using: .png, properties: [:]) else { return }
        do {
            try pngData.write(to: URL(fileURLWithPath: NSHomeDirectory())
                .appendingPathComponent("/test.png"))
        } catch {
            print(error)
        }
    }
}
swift macos cocoa
1个回答
0
投票

视图的边界是

(0.0, 0.0, 0.0, 0.0)
,因为
MyView()
创建了一个带有框架
(0.0, 0.0, 0.0, 0.0)
的视图。
NSView
的指定初始化器是
init(frame:)

self.myView = MyView(frame: NSRect(x: 0, y: 0, width: 200, height: 200))
© www.soinside.com 2019 - 2024. All rights reserved.