2015-08-30 3 views
1

Я пытаюсь создать собственный текстурированный NSWindow, чтобы он отображался с другим градиентом по умолчанию.Текстурированный NSWindow Background Gradient

До сих пор я подклассифицировал 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) 
    } 
} 

У меня даже есть правильный путь?

ответ

2

NSWindow является подклассом NSResponder, и вы не должны рисовать внутри него.

Решение:

  1. Вы должны переопределить «contentView» переменный (пользовательские окна подкласса) и установите его слой на CAGradientLayer, которые вы создаете в установленном методе «contentView»

  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") 
    } 

} 

Window with background

Решение 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) 
    } 
} 

Solution2

Если вам нужен пользовательский заголовок, тогда посмотрите here. Это большая работа.

PS: Помните, что реальный рисунок делается в NSView

+0

Спасибо за ответ, не могли бы вы предоставить некоторые примеры кода, чтобы помочь мне в правильном направлении? –

+0

Так что я должен посмотреть ссылку, чтобы настроить заголовок, если я хочу, чтобы градиент переместился с верхней части заголовка в нижнюю часть окна? –

+0

Я предоставил вам код и все необходимые ссылки. Я не могу больше. –