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

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

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

Теперь IdentFormController имеет awakeFromNib () метод, в который он пытается расположить окно. Ради простоты я только что попытался сделать setFrameOrigin (NSMakePoint (0, 0)). То, что происходит, следующие:

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

10
задан benzado 13 February 2010 в 16:54
поделиться

4 ответа

Во-первых, похоже, вам нужно проверить «освобождение при закрытии» или «отпускание при закрытии» в инспекторе свойств NSWindow. Затем окно очистится после себя, и вы сможете удалить (рискованный) вызов [самовосстановление] в своем собственном коде.

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

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

1
ответ дан 3 December 2019 в 20:04
поделиться

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

0
ответ дан 3 December 2019 в 20:04
поделиться

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

Если предположить, что 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, потому что он был протестирован и это то, что пользователь ожидает увидеть, а также с точки зрения дизайна, как дизайнер, я не всегда полагаюсь на реальный центр там, где находится оптический центр.

13
ответ дан 3 December 2019 в 20:04
поделиться

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

[myWindowController setShouldCascadeWindows: NO];

?

5
ответ дан 3 December 2019 в 20:04
поделиться