Начальный размер 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 удалить информацию автосохранения.

Другие вопросы по тегам