NSWindow は NSResponder のサブクラスであり、その中で描画するべきではありません。
ソリューション:
"contentView" 変数 (カスタム ウィンドウ サブクラス) をオーバーライドし、そのレイヤーを "contentView" の set メソッドで作成する CAGradientLayer に設定する必要があります。
NSView のカスタム サブクラスを作成し、それを Storyboard/XIB のカスタム ウィンドウのビューに設定します。ビューでは、drawInRect をオーバーライドするか、レイヤー アプローチを使用します。
さらに、ここを見てカスタム NSWindow を描画する方法
クイックダーティコードが続きます
import Cocoa
class CustomWindow : NSWindow {
override init(contentRect: NSRect, styleMask aStyle: Int, backing bufferingType: NSBackingStoreType, defer flag: Bool) {
super.init(contentRect: contentRect, styleMask: aStyle, backing: bufferingType, defer: flag)
}
override var contentView: AnyObject {
set {
var view = newValue as! NSView
view.wantsLayer = true
let colorTop = NSColor(red: 48 / 255, green: 35 / 255, blue: 174 / 255, alpha: 1).CGColor
let colorBottom = NSColor(red: 200 / 255, green: 109 / 255, blue: 215 / 255, alpha: 1).CGColor
let gradient = CAGradientLayer()
gradient.colors = [ colorTop, colorBottom]
gradient.locations = [ 0.0, 1.0]
view.layer = gradient
super.contentView = view
}
get {
return super.contentView
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
解決策 2:
import Cocoa
class CustomView : NSView {
override func drawRect(dirtyRect: NSRect) {
let colorTop = NSColor(red: 48 / 255, green: 35 / 255, blue: 174 / 255, alpha: 1)
let colorBottom = NSColor(red: 200 / 255, green: 109 / 255, blue: 215 / 255, alpha: 1)
let gradient = NSGradient(colors: [colorTop, colorBottom])
gradient.drawInRect(dirtyRect, angle: 45)
}
}
カスタム タイトルバーが必要な場合は、こちらをご覧ください。大変な作業です。
PS: 実際の描画は NSView で行われることに注意してください。