Cocoa аномалия положения окна

У меня есть странная проблема с позиционированием окна на экране. Я хочу центрировать окно на экране, но я не знаю, как это сделать. Вот что у меня есть. Окно создается из nib основным контроллером:

IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"];
[[ftf window] makeKeyAndOrderFront:self];

Теперь IdentFormController имеет метод awakeFromNib(), в котором он пытается расположить окно. Для простоты я просто попытался сделать setFrameOrigin (NSMakePoint (0, 0)). Что происходит:

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

Ответ 1

Итак, насколько я понимаю, вы хотите центрировать окно на экране?

Ну, предполагая, что NSWindow *window - ваш объект окна, тогда есть два метода...

[window center];

Это лучший способ сделать это, но он должен принимать во внимание визуальный вес и присутствие Dock.

Если вы хотите мертвый центр, тогда это сработает...

// Calculate the actual center
CGFloat x = (window.screen.frame.size.width - window.frame.size.width) / 2;
CGFloat y = (window.screen.frame.size.height - window.frame.size.height) / 2;

// Create a rect to send to the window
NSRect newFrame = NSMakeRect(x, y, window.frame.size.width, window.frame.size.height);

// Send message to the window to resize/relocate
[window setFrame:newFrame display:YES animate:NO];

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

Ответ 2

Вероятно, вы столкнулись с автоматическим позиционированием окна. Вы пробовали позвонить

[myWindowController setShouldCascadeWindows: NO];

?

Ответ 3

Прежде всего, похоже, что вам нужно проверить "dealloc on close" или "release на закрытии" в инспекторе свойств NSWindow. Затем окно будет очищено после себя, и вы можете удалить (рискованный) вызов [self release] в свой собственный код.

awakeFromNib вызывается после того, как все объекты из nib были заблокированы, а выходы подключены, но может быть слишком рано устанавливать координаты окна. Я полагаю, что Cocoa выполняет некоторую работу, чтобы автоматически позиционировать последующие окна ниже и справа от существующих окон, чтобы новые окна не полностью заслоняли старые. Вероятно, это произойдет после того, как вы установите позицию в awakeFromNib, топая на ваших изменениях.

Лучшее место для установки позиции окна, вероятно, входит в один из методов делегата NSWindow (возможно, windowWillBecomeVisible:) или, возможно, прямо перед вызовом makeKeyAndOrderFront:.

Ответ 4

Проверьте, можете ли вы установить центр вашего окна с центром экрана. И установите положение окна на нем. Это может сработать.