在windodDidResize事件结束时执行函数

问题描述 投票:0回答:2

我想在 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

swift macos cocoa
2个回答
2
投票

您可以实现可选方法

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

0
投票

Leo 的答案很好,但一个重要的警告(我刚刚发现)是,如果用户在辅助功能设置中设置了“减少运动”首选项,则不会调用 windowDidEndLiveResize,并且 windowDidResize 仅调用一次(而不是像 OP 那样调用多次)说明,使用默认设置)。

因此需要检测这种情况,可能相当罕见。

© www.soinside.com 2019 - 2024. All rights reserved.