2015-05-11 3 views
3

В Yosemite (и, возможно, раньше) механизм автосохранения оконной рамки не выполняет автоматическое позиционирование окон, перенесенных с основного дисплея на второй монитор, или в любую позицию, которая перекрывает второй монитор.NSWindow autosave - позиция не сохранена на 2-м мониторе

Вместо этого при последующем создании экземпляра окно автоматически позиционируется в предыдущем местоположении (если было допустимое положение, записанное по умолчанию) или по умолчанию для окна, или в случае перекрывающихся окон, позиция, которая помещает окно полностью на главном экране.

Это происходит независимо от того, установлено ли свойство автосохранения в окне в Interface Builder или через NSWindowController. например

-(void)windowDidLoad 
{ 
    [super windowDidLoad]; 
    [self setShouldCascadeWindows:NO]; 
    [self setWindowFrameAutosaveName:@"MyWindowAutoSaveName"]; 
} 

Кто-нибудь знает об обходном пути?

ответ

3

Я не мог получить автосохранение для восстановления на 2-м мониторе. Никакое количество порки не заставит его работать. Он восстановит первый монитор в том же положении, что и окно на втором мониторе. Чтобы решить проблему, я отказался от использования API автосохранения и сделал свой собственный.

Когда окно WindowWillClose: метод вызывается первым, следует использовать BOOL, который указывает, было ли увеличено окно в полноэкранном режиме. Затем, если окно не было увеличено (подробнее об этом за секунду), используйте NSStringFromRect и сохраните прямоугольник окна.

-(void)windowWillClose:(NSNotification *)notification 
{ 
    NSString *mainWindowFrameString; 

    [_defaults setObject:[NSNumber numberWithBool:[_flimFlamViewController windowIsFullScreen]] forKey:QUITTING_ZOOM_STATE]; 

    if ([_flimFlamViewController windowIsFullScreen] == NO) { 
    mainWindowFrameString = NSStringFromRect([_ourWindow frame]); 
    [_defaults setObject:mainWindowFrameString forKey:MAIN_WINDOW_FRAME]; 
    } 

    [_defaults synchronize]; 

} 

И наоборот, когда создается окно (возможно, в awakeFromNib :) загрузить строку из NSUserDefaults и использовать NSRectFromString, чтобы получить оценки. Проверьте размеры кадров на ноль, чтобы узнать, было ли это при первом запуске приложения. Если рамка не все нули, установите рамку окна на этот CGRect.

mainWindowFrameString = [_defaults objectForKey:MAIN_WINDOW_FRAME];  // get the last saved window frame values 
    mainWindowFrame = NSRectFromString(mainWindowFrameString);    // convert it to a CGRect 

    if ((mainWindowFrame.size.width != 0) && (mainWindowFrame.size.height != 0)) { 
    [_ourWindow setFrame:mainWindowFrame display:YES]; 
    } 
    else { 
    [_ourWindow center]; 
    } 

Чтобы обработать случай что окно на весь экран увеличено, когда окно было закрыто, первый сохранить позицию фрейма, прежде чем он идет на весь экран - вы будете использовать это позже, когда откроется окно резервного копирования, чтобы поместить окно на надлежащий монитор.

-(void)windowWillEnterFullScreen:(NSNotification *)notification 
{ 
    NSString *mainWindowFrameString; 

    // save the frame's coordinates before going full screen 

    mainWindowFrameString = NSStringFromRect([_ourWindow frame]); 
    [_defaults setObject:mainWindowFrameString forKey:MAIN_WINDOW_FRAME]; 
} 

Тогда в viewWillAppear: определить, если вам нужно, чтобы увеличить окно (окно в этот момент уже было поставлено на соответствующем мониторе). toggleFullScreen: приведет к полному экрану окна.

lastZoomStateDefault = [_defaults objectForKey:QUITTING_ZOOM_STATE]; 
    _windowIsFullScreen = [lastZoomStateDefault boolValue]; 

    if (_windowIsFullScreen == YES) { 
    [_window toggleFullScreen:nil]; 
    }