2008-12-19 11 views
13

Es scheint, als ob mehr und mehr OS X-Anwendungen in diesen Tagen alle Arten von Phantasie Zeichensachen für benutzerdefinierte Steuerelemente tun. Apps wie Twitterific, Things, EventBox, Versionen nur um ein paar zu nennen ....Suchen Sie nach Informationen über benutzerdefinierte Zeichnung von Interface-Komponenten (Cocoa)

Also im Grunde bin ich auf der Suche nach Informationen darüber, wie man diese Art von Sache zu beginnen. Ich bin mir nicht sicher, ob dies nur durch Unterklassenbildung von Steuerelementen und Verwendung von benutzerdefinierter Zeichnung geschieht oder ob es etwas völlig anderes ist.

Jede Hilfe wird sehr geschätzt. Vielen Dank!

Antwort

25

Es hängt ganz davon ab, was Sie tun wollen.

Die "Show Raw Properties" -Schaltfläche in den Versionen ist zum Beispiel eine NSButton-Unterklasse, weil wir im Grunde Standard-Button-Verhalten mit unserem eigenen Look benötigten. Eine Möglichkeit, eine Schaltfläche zu unterklassifizieren, besteht darin, einfach ihre eigene -RakeRect: (NSRect) rect-Methode in der NSButton-Unterklasse zu implementieren, aber wir haben beschlossen, bei der Implementierung von NSButton in Cocoa zu bleiben, was bedeutet, dass die meisten Zeichnungen von der Zelle der Schaltfläche ausgeführt werden die Umsetzung wie folgt aussieht:

in der NSButton Unterklasse:

+ (Class) cellClass 
{ 
    return [OurButtonCell class]; 
} 

- (void)drawRect:(NSRect)rect 
{ 
    // first get the cell to draw inside our bounds 
    // then draw a focus ring if that's appropriate 
} 

in der NSButtonCell Unterklasse (OurButtonCell):

- (void)drawInteriorWithFrame: (NSRect) rect inView: (NSView *) controlView 
{ 
    // a bunch of drawing code 
} 

die Ansicht Timeline in Versionen ist eigentlich ein WebView, die Seite, Sie sehen darin Javascript t o Sie können die Header, auf die Sie klicken, ausblenden.

Als Faustregel ich verwende, bei denen mit einem benutzerdefinierten Steuerelement zu beginnen ist:

  • das Aussehen einer Standard-Cocoa Kontrolle anzupassen:
    • Unterklasse der entsprechende Steuerung (wie zB NSButton und NSButtonCell)
    • so nah wie möglich an die Art und Weise, wie das Standardsteuerelement implementiert ist (z. B. in einer buttoncell, starten Sie von der vorhandenen attributiedTitle-Instanzmethode zum Zeichnen des Schaltflächentitels, es sei denn, Sie möchten immer mit den gleichen Attributen zeichnen von was ist Set in IB oder wenn Sie mit unterschiedlichen Attributen basieren auf Zustand, wie mit dem Testablauf Schaltfläche in Versionen Hauptfenstern)
  • Erstellen ein völlig neues UI-Element zeichnen:
    • Unterklasse NSView und implementieren Sie so ziemlich alle Maus- und Tastenereignisbehandlungen (innerhalb der Ansicht, keine Notwendigkeit, "hitTest:" zu wiederholen) und Zeichnungscode selbst.
  • Um etwas zu präsentieren, die von beliebiger Höhe komplex ist, ist aber nicht eine Tabelle:
    • Sehen Sie, wenn Sie es in HTML tun, CSS und JS und es in einem WebView präsentieren. Das Web eignet sich hervorragend zum Auslegen von Text. Wenn Sie diese Verantwortung auf Ihr WebView übertragen können, kann das eine enorme Einsparung von Schmerzen im Nackenbereich bedeuten.

Empfohlene Lektüre auf das Lernen, wie man Sachen in Ihrer eigenen benutzerdefinierten Ansicht des Ziehverfahren zeichnen: Cocoa Drawing Guide

Customizing das Aussehen zum Beispiel ein NSTableView ist eine völlig andere Tasse Tee, dank der Komplexität einer Tabellenansicht, die überall passieren kann. Sie implementieren eigene benutzerdefinierte Zellen für einige Dinge, die Sie in einer Tabelle ausführen möchten, müssen jedoch die Art und Weise ändern, in der Zeilen in einer Unterklasse des eigentlichen NSTableView-Objekts hervorgehoben werden. Sehen Sie zum Beispiel den Quellcode für iTableView auf Matt Gemmell's site für ein klares Beispiel, wo was zu zeichnen ist.

Schließlich denke ich, dass Abizers Vorschlag, den Code von BWToolkit zu überprüfen, eine großartige Idee ist. Es mag zunächst etwas überwältigend sein, aber wenn Sie diesen Code lesen und verstehen können, haben Sie keine Probleme damit, Ihre eigenen benutzerdefinierten Ansichten und Steuerelemente zu implementieren.

+0

Gute Beschreibung Dirk. Ich fühle mich, als wäre ich faul gewesen ;-) – Abizern

3

Werfen Sie einen Blick auf einige ausgezeichnetes Beispiel Code: BWToolkit