我想在 windowDidResize 事件结束后执行一个函数。当该块运行时,它会打印以下内容:
NotificationCenter.default
.publisher(for: NotificationName.windowDidResize)
.sink { _ in
// Perform something
print("WindowDidResize")
}.store(in: &cancellableBag)
打印输出:
WindowDidResize
WindowDidResize
WindowDidResize
WindowDidResize <-- Want to run a function here
如何在最后一个
windowDidResize
之后执行一次函数?我想在调整窗口大小时隐藏一些 UI 元素(因为它使操作太慢),并在调整窗口大小后重新绘制它们(延迟 0.25 秒或其他)。
斯威夫特 5.3 | Xcode 12.2 | macOS 11.1
您可以实现可选方法
windowDidEndLiveResize
,该方法仅在窗口调整大小结束时调用一次:
您还可以监控didendliveresizenotification
import Cocoa
class ViewController: NSViewController, NSWindowDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear() {
super.viewWillAppear()
view.window?.delegate = self
}
func windowDidEndLiveResize(_ notification: Notification) {
print(#function)
}
}
Leo 的答案很好,但一个重要的警告(我刚刚发现)是,如果用户在辅助功能设置中设置了“减少运动”首选项,则不会调用 windowDidEndLiveResize,并且 windowDidResize 仅调用一次(而不是像 OP 那样调用多次)说明,使用默认设置)。
因此需要检测这种情况,可能相当罕见。