带纹理的 NSWindow 背景渐变
Textured NSWindow Background Gradient
我正在尝试生成我自己的纹理 NSWindow,因此它看起来与默认的金属外观渐变不同。
到目前为止,我对 NSWindow 进行了子类化,但没有成功,如下所示。
import Cocoa
class PSWindow: NSWindow {
override init(contentRect: NSRect, styleMask aStyle: Int, backing bufferingType: NSBackingStoreType, defer flag: Bool) {
super.init(contentRect: contentRect, styleMask: aStyle, backing: bufferingType, defer: flag)
let gradient: NSGradient = NSGradient(startingColor: NSColor(red: 48 / 255, green: 35 / 255, blue: 174 / 255, alpha: 1), endingColor: NSColor(red: 200 / 255, green: 109 / 255, blue: 215 / 255, alpha: 1))
gradient.drawInRect(contentRect, angle: 45)
}
}
我的做法是否正确?
NSWindow 是 NSResponder 的子类,您不应该在其中绘图。
解决方案:
你应该覆盖 "contentView" 变量(自定义 window 子类)并将其层设置为你在 "contentView"[=16 的设置方法中创建的 CAGradientLayer =]
创建 NSView 的自定义子类并将其设置为 Storyboard/XIB 中自定义 window 的视图。在视图中,您可以覆盖 drawInRect 或使用图层方法。
另外看这里How to draw custom 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)
}
}
如果您需要自定义标题栏,请查看 here。工作量很大。
PS: 记住实际绘制是在NSView中完成的
我正在尝试生成我自己的纹理 NSWindow,因此它看起来与默认的金属外观渐变不同。
到目前为止,我对 NSWindow 进行了子类化,但没有成功,如下所示。
import Cocoa
class PSWindow: NSWindow {
override init(contentRect: NSRect, styleMask aStyle: Int, backing bufferingType: NSBackingStoreType, defer flag: Bool) {
super.init(contentRect: contentRect, styleMask: aStyle, backing: bufferingType, defer: flag)
let gradient: NSGradient = NSGradient(startingColor: NSColor(red: 48 / 255, green: 35 / 255, blue: 174 / 255, alpha: 1), endingColor: NSColor(red: 200 / 255, green: 109 / 255, blue: 215 / 255, alpha: 1))
gradient.drawInRect(contentRect, angle: 45)
}
}
我的做法是否正确?
NSWindow 是 NSResponder 的子类,您不应该在其中绘图。
解决方案:
你应该覆盖 "contentView" 变量(自定义 window 子类)并将其层设置为你在 "contentView"[=16 的设置方法中创建的 CAGradientLayer =]
创建 NSView 的自定义子类并将其设置为 Storyboard/XIB 中自定义 window 的视图。在视图中,您可以覆盖 drawInRect 或使用图层方法。
另外看这里How to draw custom 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)
}
}
如果您需要自定义标题栏,请查看 here。工作量很大。
PS: 记住实际绘制是在NSView中完成的