2014-11-12 10 views
6

Meine App verfügt über eine Option, die es dem Benutzer ermöglicht, zwischen der Standard Titelleiste/Symbolleiste und der Titelleiste/Symbolleiste zu wählen, die in der NSWindow 10.10 API verfügbar ist. Insbesondere verwende ich die -titleVisibility-Methode, um entweder NSWindowTitleVisible oder NSWindowTitleHidden abhängig von den Vorlieben des Benutzers festzulegen. Wenn der Benutzer das Kontrollkästchen "Kompakte Titelleiste" aktiviert, wird NSWindowTitleHidden auf das Fenster angewendet, andernfalls verwendet das Fenster den Standardstil. Wenn sich der Wert des Kontrollkästchens ändert, wird der Wert in den Benutzervorgaben der App gespeichert und das Fenster wird aktualisiert/neu gezeichnet.NSWindow mit NSWindowTitleVisibilityNone Speichern eines falschen Frames für Benutzerstandards?

Alles funktioniert gut, bis die Anwendung neu gestartet wird. Jedes Mal, wenn die App gestartet wird, wächst das Fenster genau um den Speicherplatz, indem Sie vom Standardfensterformat (NSWindowTitleVisible) zum neuen Format wechseln (NSWindowTitleHidden). Wenn Sie die App also 5 - 6 Mal neu starten, wird das Fenster mit der Menüleiste und dem Dock bündig, je nachdem, wie groß das Fenster war, als das Kontrollkästchen anfänglich aktiviert war.

Mit anderen Worten, es scheint nicht wie der Rahmen des Fensters in NSUserDefaults aktualisiert wird, wenn die Eigenschaft festgelegt ist. Gibt es einen Workaround dafür, oder übersehe ich nur etwas? Jeder Rat wäre muy hilfreich.

Danke!

+0

Es ist verrückt, dass sie, dass noch nicht festgelegt haben, bin ich das gleiche Problem hat, 'Einstellung [self.window setTitleVisibility: NSWindowTitleHidden];' in meinem Fenster des Controllers 'awakeFromNib' Methode. Vielleicht machen wir etwas falsch ... – Nightbirdsevolve

+0

Die Kalender-App von OSX 10.10 sieht genau so aus und hat das Problem nicht. – Nightbirdsevolve

Antwort

0

einfache Lösung für jetzt ist das Fenster des Rahmens manuell zu speichern und wiederherstellen, hier ist, wie ich es tun:

In AppDelegate, wenn die Anwendung beendet wird, der Rahmen des Fensters speichern

- (void)applicationWillTerminate:(NSNotification *)notification 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:NSStringFromRect(self.windowController.window.frame) forKey:@"WindowFrameKey"]; 
} 

in Ihrer -awakeFromNib Methode der Fenstersteuerung, zur Wiederherstellung des Rahmen

- (void)awakeFromNib 
{ 
    if([NSWindow instancesRespondToSelector:@selector(setTitleVisibility:)]) 
    { 
     // Hide Titlebar 
     [self.window setTitleVisibility:NSWindowTitleHidden]; 

     NSString *winFrameString = [[NSUserDefaults standardUserDefaults] stringForKey:@"WindowFrameKey"]; 

     if(winFrameString != nil) 
     { 
      NSRect savedRect = NSRectFromString(winFrameString); 

      if(!NSEqualRects(self.window.frame, savedRect)) 
      { 
       [self.window setFrame:savedRect display:YES animate:NO]; 
      } 
     } 
    } 
2

Versuchen Sie, die titleVisibility prop Einstellung erty auf die Nummer 1 in der User Defined Runtime Attribute

enter image description here

1 für NSWindowTitleHidden

typedef NS_ENUM(NSInteger, NSWindowTitleVisibility) { 
    /* The default mode has a normal window title and titlebar buttons. */ 
    NSWindowTitleVisible = 0, 
    /* The always hidden mode hides the title and moves the toolbar up into the area previously occupied by the title. */ 
    NSWindowTitleHidden = 1, 
} NS_ENUM_AVAILABLE_MAC(10_10); 

der entsprechende Wert ist, jedoch würde dies eine Nachricht an die Konsole aus beschweren, dass NSWindow ist Schlüsselcodierung nicht kompatibel für den Schlüssel titleVisibility auf OS X-Versionen vor 10.10

1

Eine bessere (und bestätigte Arbeits) Lösung wurde bei https://openradar.appspot.com/18510665 von pointum posted:

Das Problem ist, dass die Fenstergröße durch das System wiederhergestellt wird mit -[NSWindow setFrameUsingName:] vor titleVisibility gesetzt. Lösung:

  1. Entfernen Sie "Autosave Name" -Wert in Interface Builder.
  2. In Code direkt nach Einstellung titleVisibility mit -[NSWindow setFrameAutosaveName:] setzen.