Начальный размер NSWindow в процентах от размера экрана
Я хотел бы установить размер NSWindow в зависимости от размера экрана.
В Интерфейсном Разработчике есть возможность установить его в точках, но не в зависимости от размера экрана.
Как я могу установить его программно по умолчанию?
Обратите внимание, что я все еще хочу, чтобы сохранение пользовательского интерфейса восстановило его размер с предыдущего сеанса, если такое состояние доступно.
2 ответа
Ну, вы можете получить размер экрана и просто применить к нему немного математики, чтобы все заработало. Установите размеры окна на размеры экрана, умноженные на процент экрана, который вы хотите, чтобы окно занимало. Продвигаясь дальше, вы можете сделать это и сохранить центр по центру, умножив его источник на (1-процентный)/2.0.
NSRect screenSize = [[NSScreen mainScreen] frame];
CGFloat percent = 0.6;
CGFloat offset = (1.0 - percent) / 2.0;
[self.window setFrame:NSMakeRect(screenSize.size.width * offset, screenSize.size.height * offset, screenSize.size.width * percent, screenSize.size.height * percent) display:YES];
Взяв за основу отличный ответ 0x7fffffff: вот полное решение в Swift, которое работает с автосохранением. Протестировано с XCode 7 Beta 6.
В конструкторе интерфейса установите класс окна в MainWindow
и укажите имя автосохранения в инспекторе атрибутов окна. Следующий код устанавливает координаты окна только тогда, когда информация о автосохранении еще не существует, т.е. окно отображается впервые. После этого (например, после перезапуска приложения) окно восстанавливает свою последнюю позицию и размер.
class MainWindow: NSWindow {
var didInitialResize = false
override func awakeFromNib() {
super.awakeFromNib()
let defaults = UserDefaults.standard
if !didInitialResize && defaults.object(forKey: "NSWindow Frame \(frameAutosaveName)") == nil {
didInitialResize = true
let screenSize = NSScreen.main!.frame
let percent = CGFloat(0.90)
let offset: CGFloat = CGFloat((1.0 - percent) / 2.0)
setFrame(NSMakeRect(
screenSize.size.width * offset,
screenSize.size.height * offset,
screenSize.size.width * percent,
screenSize.size.height * percent),
display: true)
}
}
}
Кстати, информация о автосохранении сохраняется в файле настроек приложения. Для тестирования может быть полезно сделать rm ~/Library/Preferences/myapp.plist; sudo killall cfprefsd
удалить информацию автосохранения.