操作系统版本: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)
}
}
}
视图的边界是
(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))