Слушайте событие изменения размера окна в 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
}