Focus-Rechteck um eigene View malen

  • Focus-Rechteck um eigene View malen

    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
  • RE: Focus-Rechteck um eigene View malen

    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

    Quellcode

    1. [self setFocusRingType: NSFocusRingTypeExterior];
    und

    Quellcode

    1. [self setFocusRingType: NSFocusRingTypeDefault];
    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.
  • RE: Focus-Rechteck um eigene View malen

    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...
  • RE: Focus-Rechteck um eigene View malen

    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:

    Quellcode

    1. if ( [[self window] isKeyWindow]
    2. && [[self window] firstResponder] == self )
    3. {
    4. [NSGraphicsContext saveGraphicsState];
    5. NSSetFocusRingStyle( NSFocusRingOnly );
    6. [[NSColor keyboardFocusIndicatorColor] set];
    7. NSFrameRectWithWidth( [self visibleRect], 1 );
    8. [NSGraphicsContext restoreGraphicsState];
    9. }
    Alles anzeigen

    Damit wird das focus rect gemalt. Damit es gelöscht wird, wenn die View den Input-Focus verliert:

    Quellcode

    1. //we're about to loose the input focus
    2. - (BOOL) resignFirstResponder
    3. {
    4. if ( ![super resignFirstResponder] )
    5. return NO;
    6. [self setKeyboardFocusRingNeedsDisplayInRect: [self visibleRect]];
    7. return YES;
    8. }

    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 ()

  • RE: Focus-Rechteck um eigene View malen

    Weiß jemand, wie eine View mitbekommt, das ihr Fenster nicht mehr "key" ist?

    Quellcode

    1. - (void)windowDidBecomeKey:(NSNotification *)notification
    2. - (void)windowDidResignKey:(NSNotification *)notification
    und darin dann ne neue notification posten, auf die das view reagiert.. evtl :)
  • RE: Focus-Rechteck um eigene View malen

    Gute Idee!

    Ich habe die View für die beiden Notifications "NSWindowDidResignKeyNotification" und "NSWindowDidBecomeKeyNotification" angemeldet und in den jeweilige Handler-Methoden

    Quellcode

    1. [self setKeyboardFocusRingNeedsDisplayInRect: [self visibleRect]];
    ausgeführt. dadurch wird der Bereich des focus rects invalidiert und neu gezeichnet.