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
Проверьте, можете ли вы установить центр вашего окна с центром экрана. И установите положение окна на нем. Это может сработать.