1

独自のテクスチャ 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)
    }
}

私はこれを正しい方法で行っていますか?

4

1 に答える 1

4

NSWindow は NSResponder のサブクラスであり、その中で描画するべきではありません。

ソリューション:

  1. "contentView" 変数 (カスタム ウィンドウ サブクラス) をオーバーライドし、そのレイヤーを "contentView" の set メソッドで作成する CAGradientLayer に設定する必要があります。

  2. 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)
  }
}

ソリューション2

カスタム タイトルバーが必要な場合は、こちらをご覧ください。大変な作業です。

PS: 実際の描画は NSView で行われることに注意してください。

于 2015-08-31T11:33:12.063 に答える