центр программно созданного окна - PullRequest
9 голосов
/ 16 апреля 2011

Я использовал пример отсюда для создания собственного окна без заголовка:

Рисование пользовательского окна в Mac OS X

Я обнаружил, что это единственный способ, которым я могу создать окно без заголовка в Leopard, Snow Leopard и Lion, другие методы не работают ни на Leopard, ни на Lion. (Если я попытаюсь вызвать окно без заголовка через обычные NSWindow и IB, оно больше не запустится в Leopard)

Пока что это пользовательское окно без заголовка прекрасно работает везде, но я не могу его центрировать, только жестко фиксированное положение в Интерфейсном Разработчике.

Довольно просто центрировать обычную реализацию окна NSWindow * с помощью [окна центра], но я не нашел ничего, что работает с этим подклассом пользовательского окна, окном, которое не создается из пера через Interface Builder.

Я попробовал несколько вещей из NSWindow , но, похоже, ничего не работает.

Есть идеи?

Ответы [ 4 ]

16 голосов
/ 16 апреля 2011
CGFloat xPos = NSWidth([[window screen] frame])/2 - NSWidth([window frame])/2;
CGFloat yPos = NSHeight([[window screen] frame])/2 - NSHeight([window frame])/2;
[window setFrame:NSMakeRect(xPos, yPos, NSWidth([window frame]), NSHeight([window frame])) display:YES];

Это помещает его в буквальный центр экрана, не принимая во внимание пространство, занимаемое док-станцией и строкой меню. Если вы хотите сделать это, измените [[window screen] frame] на [[window screen] visibleFrame].

5 голосов
/ 01 апреля 2016
extension NSWindow {
    public func setFrameOriginToPositionWindowInCenterOfScreen() {
        if let screenSize = screen?.frame.size {
            self.setFrameOrigin(NSPoint(x: (screenSize.width-frame.size.width)/2, y: (screenSize.height-frame.size.height)/2))
        }
    }
}
4 голосов
/ 16 апреля 2011

Вопрос, вероятно, должен заключаться в том, почему [window center] не работает; но в этом случае используйте NSScreen, чтобы получить координаты экрана, выполнить математические расчеты и центрировать окно напрямую.

0 голосов
/ 26 октября 2015

Swift версия: можно написать простую статическую служебную функцию для того же

static func positionWindowAtCenter(sender: NSWindow?){
        if let window = sender {
            let xPos = NSWidth((window.screen?.frame)!)/2 - NSWidth(window.frame)/2
            let yPos = NSHeight((window.screen?.frame)!)/2 - NSHeight(window.frame)/2
            let frame = NSMakeRect(xPos, yPos, NSWidth(window.frame), NSHeight(window.frame))
            window.setFrame(frame, display: true)
        }
}
...