Слушайте событие изменения размера окна в Swift/Objective-C

Можно ли перебирать все открытые окна любого приложения в OSX и слушать их события изменения размера в Swift? Я хочу создать пользовательский диспетчер окон, который будет перемещать и изменять размер событий на основе поведения пользователя - поэтому, если пользователь изменяет размер окна, другие окна автоматически переустраиваются.

Я Хаскелл, а не разработчик Swift, поэтому я был бы очень замешан для любого фрагмента кода/примера, показывающего, как добиться этого эффекта. (На самом деле я буду использовать его как своего рода привязку Haskell → Cocoa.)

Edit: Мне было бы очень интересно также использовать решение в Objective-C, но для меня здесь важнее Swift.

Ответ 1

Можно ли перебирать все открытые окна любого приложения в OSX и слушать их события изменения размера в Swift?

Это можно сделать, лучший способ заключается в том, чтобы ваш пользовательский класс оконного менеджера реализовал протокол NSWindowDelegate и установил все окна delegate в ваш пользовательский диспетчер окон. Это даст вам все изменения размера и переместите требуемую информацию.

Я Haskell, а не разработчик Swift, поэтому мне было бы очень полезно использовать любой фрагмент кода/пример, показывающий, как добиться этого эффекта.

Реализация методов протокола:

class CustomWindowManager: NSWindowController, NSWindowDelegate {

       // Resize Methods

       func windowWillResize(sender: NSWindow,toSize frameSize: NSSize) -> NSSize {

            // Your code goes here
       }

       func windowDidResize(notification: NSNotification) {

           // Your code goes here
       }
}

Затем вы можете просто выбрать, какие методы протокола вы хотите реализовать, поскольку все методы в протоколе являются необязательными.

Вам нужно будет определить, какое окно вызывает метод делегата, и отслеживать любые окна вы перемещение или изменение размера из-за реакции на первоначальное изменение окна. См. Этот вопрос о переполнении стека для справки.

Чтобы получить список всех окон, находящихся в настоящее время на экране, см. этот вопрос о переполнении стека.

Изменить


Для получения списка всех окон вашего приложения в настоящее время на экране см. этот вопрос о переполнении стека.

Ответ 2

первый шаг, вы должны добавить NSWindowDelegate и функцию windowWillResize, полный код следующим образом:

class MainWindowController: NSWindowController, NSWindowDelegate {

    override var windowNibName: String? {
        return "MainWindowController"
    }

    override func windowDidLoad() {
        super.windowDidLoad()
    }

    func windowDidResize(notification: NSNotification) {
        //listen the event
    }

}

то вы должны установить свойство delegate, установите MainWindowController.xib, чтобы передать свойство делегата файла файлу File Owner.

введите описание изображения здесь

Ответ 3

  • создать класс NSWindowController
  • Откройте свою раскадровку и найдите свой оконный контроллер, затем установите класс как пользовательский класс (вкладка проверки идентификатора)
  • создать класс NSWindowDelegate с помощью метода windowWillResize
  • установите экземпляр NSWindowDelegate как свойство window.delegate экземпляра NSWindowController

При изменении размера окна пользователя будет вызываться метод windowWillResize.

Ответ 4

С Swift 3 метод windowDidResize должен выглядеть следующим образом:

func windowDidResize(_ notification: Notification) {
    // Listen to a window resize event

}