2015-02-24 11 views
20

Obecnie pracuję nad niestandardowym tematem NSButton. Każdy samouczek lub przewodnik, który znalazłem, wymaga podklasy NSButtonCell, nawet the guide from Apple.Jak utworzyć niestandardowy pakiet NSButton bez podklasy NSButtonCell?

Wszystkie te wydają się być nieaktualne, ponieważ wszystkie metody komórkowe w NSControl to deprecated in Yosemite. Nie znalazłem żadnych zaleceń ani wskazówek, których użyć jako substytutu.

Jest to jedyne oświadczenie, udało mi się znaleźć:

Stopniowa Wycofanie NSCell

Mac OS X 10.10 trwa kolejny krok w kierunku ostatecznego Wycofanie komórek. Bezpośredni dostęp do komórki kontrolnej jest odradzany, a metody, które pozwalają na to, będą formalnie przestarzałe w kolejnym wydaniu . Różne interfejsy API na poziomie komórki zostały promowane w różnych podklasach Control w celu zapewnienia dostępu bez komórek do ważnej funkcji . NSLevelIndicator, NSTextField, NSSearchField, NSSlider, i NSPathControl mają wszystkie nowe właściwości do tego celu. Oparte na komórkach NSTableViews są obecnie nieaktualne, a NSTableViews oparte na widoku powinny być używane zamiast tego. Matrix-based NSBrowsers są również przestarzałe na rzecz interfejsu użytkownika opartego na elementach.

Fragment: AppKit Release Notes for OS X v10.10

Brak słów na NSButton chociaż.

NSTextField obsługuje widoki warstwowe; z tego powodu próbowałem tego samego podejścia na moim NSButton, ale to nie ma wpływu.

var btn = NSButton(NSMakeRect(0, 0, 50, 20)) 
btn.wantsLayer = true 
btn.bordered = false 
btn.layer?.backgroundColor = NSColor(calibratedWhite: 0.99, alpha: 1).CGColor 
btn.layer?.borderWidth = 1 
btn.layer?.borderColor = NSColor(calibratedWhite: 0.81, alpha: 1).CGColor 
+0

Jako małą notatkę, oszukuję, jeśli to możliwe, utworzyłem niestandardowe widoki, a następnie utworzyłem niewidoczny przycisk na górze. Oszczędzi dużo bólu głowy. –

+0

Możesz po prostu podać swój motyw jako obraz tła przycisku. –

+0

@MattyAyOh wydaje się łatwe, ale bardziej przypomina hack.Nie sądzę, że jest to zamierzony sposób na zrobienie tego i chciałbym poznać zamierzony sposób. Ale dzięki za udostępnienie tej sztuczki. – Afterlame

Odpowiedz

3

Zdecydowanie spędziłbym więcej czasu na analizie podejścia layer-backed view. Nie jestem pewien, dlaczego to nie działa, ponieważ nie ma powodu, aby warstwy nie działały na NSButton (skutecznie pochodną NSView).

Ważnym aspektem patrzenia bardziej w warstwy jest wspomnienie o animacji.

Niektóre kodu pochodzących z projektu pracuję nad (na zamówienie NSButton):

Od init() ...

self.wantsLayer = true 
    self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay 

    self.layer?.borderColor = NSColor.gridColor().CGColor 
    self.layer?.borderWidth = 0.5 
    self.layer?.backgroundColor = NSColor.whiteColor().CGColor 

Następnie można uzyskać precyzyjną kontrolę cyklu wyświetlania określonego do warstw o:

override var wantsUpdateLayer:Bool{ 
    return true 
} 

override func updateLayer() { 
    // your code here 
    super.updateLayer() 
} 

Jeśli przycisk niestandardowy kształt potrzebuje wtedy można nawet użyć CAShapeLayer poniżej, aby Państwa warstwa podkładowa specjalny kształt ... więcej szczegółów t o zajrzyj do środka.

override func makeBackingLayer() -> CALayer { 
    return CAShapeLayer() 
} 
Powiązane problemy