2014-11-12 13 views
6

Moja aplikacja ma opcję, która pozwala użytkownikowi wybrać standardowy pasek tytułu/paska tytułowego "pełnowymiarowy" i "zwarty" pasek tytułu/pasek narzędzi udostępniony w interfejsie API 01.10.10. W szczególności używam metody -titleVisibility do ustawienia NSWindowTitleVisible lub NSWindowTitleHidden w zależności od preferencji użytkownika. Jeśli użytkownik zaznaczy pole wyboru "Kompaktowy pasek tytułu", NSWindowTitleHidden zostanie zastosowane do okna, w przeciwnym razie okno zastosuje styl domyślny. Po zmianie wartości pola wyboru wartość jest przechowywana w domyślnych ustawieniach użytkownika aplikacji, a okno jest aktualizowane/przerysowywane.NSWindow z NSWindowTitleVisibilityNone zapisywanie niepoprawnej ramki do domyślnych ustawień użytkownika?

Wszystko działa doskonale, dopóki aplikacja nie zostanie ponownie uruchomiona. Za każdym razem, gdy aplikacja uruchamia się, okno powiększa się o dokładnie tyle miejsca, przechodząc z domyślnego stylu okna (NSWindowTitleVisible) do nowego stylu(). W związku z tym ponowne uruchomienie aplikacji 5-6 razy spowoduje, że okno będzie zlicowane z menkorem i stacją dokującą, w zależności od tego, jak duże było okno po początkowym zaznaczeniu tego pola wyboru.

Innymi słowy, nie wygląda na to, że ramka okna jest aktualizowana w NSUserDefaults, gdy właściwość jest ustawiona. Czy istnieje obejście tego problemu, czy też coś przeoczam? Każda rada byłaby pomocna.

Dzięki!

+0

To szaleństwo, że nie zostały one ustalone, że jeszcze mam ten sam problem, ustawienie '[self.window setTitleVisibility: NSWindowTitleHidden];' 'w metodzie awakeFromNib' mojego okna sterownika. Może robimy coś złego ... – Nightbirdsevolve

+0

Aplikacja kalendarza OS X 10.10 ma ten szczególny wygląd i nie ma problemu. – Nightbirdsevolve

Odpowiedz

0

Proste fix teraz jest zapisać i przywrócić okno za ramę ręcznie, oto jak to zrobić:

W delegata aplikacji, gdy aplikacja kończy, zapisz rama okna za

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

w metodzie -awakeFromNib kontroler okien, należy przywrócić ramkę

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

Spróbuj ustawić titleVisibility rekwizyt erty z numerem 1 w User Defined Runtime Atrybuty

enter image description here

1 jest odpowiednia wartość dla 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); 

Jednak byłoby to wydrukować wiadomość do konsoli narzekają, że NSWindow jest kodowanie niezgodne z kluczem kluczowym dla klucza titleVisibility w wersjach OS X wcześniejszych niż 10.10

1

lepiej (i zatwierdzeni roboczy) roztwór pisał w https://openradar.appspot.com/18510665 przez pointum:

Problem polega na tym, że rozmiar okna jest przywracana w systemie poprzez -[NSWindow setFrameUsingName:] przed titleVisibility jest ustawiony. Rozwiązanie:

  1. Usuń wartość "Autozapisu" w Konstruktorze interfejsów.
  2. Ustaw go w kodzie zaraz po ustawieniu titleVisibility przy użyciu -[NSWindow setFrameAutosaveName:].
Powiązane problemy