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

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

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

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

4 ответов


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

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

Я 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
       }
}

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

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

для получения списка всех окон в настоящее время на экране см. Это вопрос переполнения стека.

редактировать


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


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

class MainWindowController: NSWindowController, NSWindowDelegate {

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

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

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

}

затем вы должны установить свойство делегата,установите MainWindowController.xib включает свойство делегата окна файла владельцу файла.

enter image description here


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

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

}

  1. создать NSWindowController класс
  2. откройте раскадровку и найдите контроллер окна, затем установите класс как пользовательский класс (вкладка проверка подлинности)
  3. создайте класс NSWindowDelegate с помощью метода windowWillResize
  4. установите экземпляр NSWindowDelegate в качестве окна.делегат свойство экземпляра NSWindowController

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