【问题标题】:Textured NSWindow Background Gradient纹理 NSWindow 背景渐变
【发布时间】:2015-08-30 22:57:27
【问题描述】:

我正在尝试生成我自己的纹理 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)
    }
}

我是否以正确的方式进行此操作?

【问题讨论】:

    标签: swift background gradient nswindow nsgradient


    【解决方案1】:

    NSWindow 是 NSResponder 的子类,您不应该在其中绘图。

    解决方案:

    1. 您应该覆盖“contentView”变量(自定义窗口子类)并将其图层设置为您在“contentView”的 set 方法中创建的 CAGradientLayer

    2. 创建 NSView 的自定义子类,并将其设置为 Storyboard/XIB 中自定义窗口的视图。在视图中,您可以覆盖 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 中完成的

    【讨论】:

    • 感谢您的回复,您能否提供一些代码示例来帮助我找到正确的方向?
    • 如果我想让渐变从标题栏顶部到窗口底部,我应该查看自定义标题栏的链接吗?
    • 我为您提供了代码和所有必要的链接。我不能再做更多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多