2015-09-23 2 views
1

У меня есть пользовательский NSWindow (BorderlessWindow.swift) и NSView (TransparentView.swift), и я добавляю метку (NSTextField) к TransparentView.Прозрачный фон NSWindow не был восстановлен

Когда я скрыть метку, то TransparentView не выздоровел:

Перед Скрыть захвата изображения:

enter image description here

После Скрыть захвата изображения:

enter image description here

Как может Я чиню это?

BorderlessWindow.swift

class BorderlessWindow: NSWindow { 

override init(contentRect: NSRect, styleMask aStyle: Int, backing bufferingType: NSBackingStoreType, `defer` flag: Bool) { 

    super.init(contentRect: contentRect, 
     styleMask: NSBorderlessWindowMask, 
     backing: NSBackingStoreType.Buffered, 
     `defer`: false) 

    self.alphaValue = 1.0 
    self.opaque = false 
    self.movableByWindowBackground = true 

} 

@IBOutlet weak var testString: NSTextField! 

@IBAction func clicked(sender: NSButton) { 
    if testString.hidden == false { 
     testString.hidden = true 
    } 
    else { 
     testString.hidden = false 
    } 
} 

override var canBecomeKeyWindow:Bool { 
    get { 
     return true 
    } 
} 

required init?(coder: NSCoder) { 
    super.init(coder: coder) 
} 

TransparentView.swift

class TransparentView: NSView { 

override func drawRect(dirtyRect: NSRect) { 

    super.drawRect(dirtyRect) 

    NSColor.clearColor().set() 
    NSRectFill(self.bounds) 

    let path = NSBezierPath(roundedRect: self.bounds, xRadius: 10, yRadius: 10) 
    let path2 = NSBezierPath(roundedRect: NSMakeRect(self.bounds.origin.x + 10, self.bounds.origin.y + 10, self.bounds.size.width - 20, self.bounds.size.height - 20), xRadius: 10, yRadius: 10) 

    NSColor(calibratedRed: 1, green: 0.7, blue: 0, alpha: 0.5).setFill() 
    NSColor(calibratedRed: 1, green: 1, blue: 1, alpha: 1).setStroke() 

    path2.lineWidth = 3.0 
    path.lineJoinStyle = NSLineJoinStyle.RoundLineJoinStyle 
    path.lineCapStyle = NSLineCapStyle.RoundLineCapStyle 


    path2.fill() 
    path2.stroke() 

    // Drawing code here. 
} 



override init(frame frameRect: NSRect) { 
    super.init(frame: frameRect) 
} 

required init?(coder: NSCoder) { 
    super.init(coder: coder) 
} 

} 

я нашел: Когда начальное значение TextField в скрытой собственности верно (текстовое поле инициализируется со скрытым состоянием) , он отлично работает.

+0

Является ли текстовое поле сконфигурированным для рисования фона (что может быть четкого цвета)? Если да, то лучше ли это будет, если вы отключите это? Кроме того, ваш 'drawRect()' должен работать в терминах 'dirtyRect' или' self.bounds', а не 'self.frame'. –

+0

текстовое поле настроено так, чтобы не рисовать его фон. и у меня все еще такая же проблема. Спасибо за ответ. – kingleo

+0

Вы по-прежнему используете 'self.frame' для первого пути. Вы пытались вызвать 'self.invalidateShadow()' после переключения состояния 'hidden' текстового поля? –

ответ

0

Для окна с прозрачными частями вам необходимо аннулировать тень после изменения того, что было нарисовано. Тень вычисляется из непрозрачных (или в основном непрозрачных) частей и, следовательно, зависит от того, что именно нарисовано.

Итак, после того, как вы измените способ его рисования, будь то скрытый вид или перерисовка, вам необходимо позвонить invalidateShadow() в окно.

+0

Примечание: мне пришлось делать 'self.window !.hasShadow = false', чтобы заставить его сделать недействительным –

Смежные вопросы