2015-01-02 5 views
0

У меня есть приложение с одним окном, на котором есть некоторые флажки на экране.MAC Cocoa - Программно заданный размер окна

Я использую NSUserDefaults для хранения не только состояния флажков, но и ширины, высоты и положения главного окна (x/y).

Моя проблема - найти правильное событие для чтения и установки свойств окна.

В настоящее время я делаю это на:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
// read preferences 
UserPreferences *userPrefs = [[UserPreferences alloc] init]; 
NSRect oldFrame = [window frame]; 
if([userPrefs MainWindowWidth] > 0) 
    oldFrame.size.width = [userPrefs MainWindowWidth]; 

if([userPrefs MainWindowHeight] > 0) 
    oldFrame.size.height = [userPrefs MainWindowHeight]; 

if([userPrefs MainWindowTop] > 0) 
    oldFrame.origin.y = [userPrefs MainWindowTop]; 

if([userPrefs MainWindowLeft] > 0) 
    oldFrame.origin.x = [userPrefs MainWindowLeft]; 

// set windows properties 
[window setFrame:oldFrame display:YES animate:NO]; 
} 

Он работает, но экран первый показывает размер по умолчанию, а затем меняется на хранимого размера, чтобы визуально икота. Это говорит мне, что слишком поздно в цепочке событий установить эти параметры.

Я также пробовал awakefromnib, но это кажется слишком ранним в цепочке, поскольку установка ширины и высоты просто игнорируется.

Какое событие будет правильным для подключения этого кода для сброса окна прямо перед его показом на экране?

Любой совет будет оценен. Каждое начало тяжелое.

спасибо.

ответ

1

Это потому, что рамка окна сначала загружается из nib, а затем отображается окно (после завершения загрузки с nib).

Вы можете отключить флажок «показать окно при запуске» в построителе интерфейса и показать его вручную в applicationDidFinishLaunching.

+0

благодарит за ваш ответ. Я не могу найти «окно показа на старт», но «Видимый при запуске». Это то, о чем вы говорите? – Mozzak

+0

, поэтому я попытался отключить «видимый при запуске» и показать окно на «applicationDidFinishLaunching». он все еще мерцает. Кажется, он сначала загружает окно по умолчанию, а затем новый размер сразу после. Любые другие идеи? – Mozzak

0

Функция ApplicationDidFinishLaunching - это место, где можно заняться, как только приложение завершит запуск. Но то, что вы действительно хотите, - это поймать окно в то время, когда оно только что было загружено из наконечника, но до его показания. IOW, вы пытаетесь сделать это не в том месте.

Вам нужно больше управление над вашим окном, поэтому ... создайте свой собственный оконный контроллер! Создайте свой собственный класс, который наследуется от NSWindowController, скажем, MyWindTrol. В файле реализации добавьте функцию awakeFromNib и приложите все усилия для контроля размера и местоположения вашего окна.

В файле nib перетащите NSObject из библиотеки, объявите его классом MyWindTrol и перетащите его в управляющие элементы, чтобы свойство окна объекта MyWindTrol указывало на объект окна.

Смежные вопросы