У меня есть странная проблема с расположением окна на экране. Я хочу центрировать окно на экране, но я не знаю, как сделать это. Вот то, что я имею. Окно создается из пера основным контроллером:
IdentFormController *ftf = [[IdentFormController alloc] initWithWindowNibName:@"IdentForm"];
[[ftf window] makeKeyAndOrderFront:self];
Теперь IdentFormController имеет awakeFromNib () метод, в который он пытается расположить окно. Ради простоты я только что попытался сделать setFrameOrigin (NSMakePoint (0, 0)). То, что происходит, следующие:
В первый раз, когда я создаю это окно, все работает как ожидалось. Но если я создаю его снова после выпуска предыдущего, это начинает появляться наугад положения. Почему это делает это?
Во-первых, похоже, вам нужно проверить «освобождение при закрытии» или «отпускание при закрытии» в инспекторе свойств NSWindow. Затем окно очистится после себя, и вы сможете удалить (рискованный) вызов [самовосстановление]
в своем собственном коде.
awakeFromNib
вызывается после разархивирования всех объектов из пера и подключения выходов, но это может быть слишком рано для установки координат окна. Я считаю, что Cocoa выполняет некоторую работу по автоматическому позиционированию последующих окон ниже и справа от существующих окон, чтобы новые окна не закрывали полностью старые. Вероятно, это происходит ПОСЛЕ того, как вы устанавливаете позицию в awakeFromNib, продолжая вносить изменения.
Лучшее место для установки положения окна, вероятно, - это один из методов делегата NSWindow (возможно, windowWillBecomeVisible:
) или, возможно, прямо перед вызовом makeKeyAndOrderFront:
.
Проверьте, можете ли вы установить центр окна по центру экрана. И установите на нем положение окна. Это может сработать.
Итак, насколько я понимаю, вы хотите центрировать окно на экране?
Если предположить, что NSWindow * window
- это ваш оконный объект, тогда есть два метода ...
[window center];
Это лучший способ сделать это, но это может потребовать учитывать визуальный вес и наличие дока.
Если вам нужна мертвая точка, то это сработает ...
// 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, потому что он был протестирован и это то, что пользователь ожидает увидеть, а также с точки зрения дизайна, как дизайнер, я не всегда полагаюсь на реальный центр там, где находится оптический центр.
Вероятно, вы столкнулись с автоматическим позиционированием окна. Пробовали ли вы вызвать
[myWindowController setShouldCascadeWindows: NO];
?