Die ganzen Cocoa-Controls (NSTableView, NSOutlineView, ..) malen selbstständig ein blaues Rechteck um die View, wenn sie den Eingabefokus haben.
Wie kann ich so ein Rechteck um eine (custom) NSView zeichnen lassen? Muß das manuell (durch selberzeichnen) geschehen oder gibt es etwas Fertiges?
Danke,
Tjark
Focus-Rechteck um eigene View malen
-
-
Also ich kann nur sagen, dass das in 10.3 stark verbessert wurde. Ich würde dir einfach vorschlagen, mal nen test zu machen. Mach ne NSControll subclass und setz den Focus ring type...
-
Die neue Methode setFocusRingType: kannte ich nicht! Meine View, die das Focus-Rect zeichnen soll, ist von NSView abgeleitet. Sie ist zusammen mit einer Standard-NSOutlineView in einem Fenster enthalten. Die NSOutlineView zeichnet das Focus-Rect, meine View leider nicht. Ich habe und solwohl in initWithFrame: als auch in awakeFrom: ausprobiert, leider wird das Focus-Rect nicht gezeichnet. Meine View überschreibt die Methoden "- (BOOL) acceptsFirstResponder" und "- (BOOL) canBecomeKeyView" und gibt jeweils YES zurück.
-
Versuch doch einfachmal testweise, deinen View von NSControll und nicht NSView zu vererben. Ob das nötig ist und 100% funktioniert ist erstmal die zweite Frage, aber es wäre sicherlich interessant zu wissen, ob es da geht. Wenn nicht glaube ich, dass du ihn selbst malen musst...
-
Es scheint tatsächlich so zu sein, dass man das focus rect selber zeichnen muss (habe noch mal ein bisschen im Web gestöbert).
In drawRect:
Alles anzeigenQuellcode
Damit wird das focus rect gemalt. Damit es gelöscht wird, wenn die View den Input-Focus verliert:
Das ganze ist dann auch 10.2 kompatibel, da setFocusRingType: von NSView nicht benötigt wird.
Leider bleibt das focus rect stehen, wenn das Fenster in den Hintergrund geklickt wird. Die Standard-Controls löschen dann das focus rect.
Weiß jemand, wie eine View mitbekommt, das ihr Fenster nicht mehr "key" ist?Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von chacko ()
-
-
Gute Idee!
Ich habe die View für die beiden Notifications "NSWindowDidResignKeyNotification" und "NSWindowDidBecomeKeyNotification" angemeldet und in den jeweilige Handler-Methoden
ausgeführt. dadurch wird der Bereich des focus rects invalidiert und neu gezeichnet.