[Swift4/Cocoa] NSWindowのサイズ変更(リサイズ)を検知する方法

2018年6月25日(更新: 2018年6月25日)

Cocoa Application のウィンドウ(NSWindow)がリサイズされた時に処理を行いたい場合の Swift のプログラムについてです。

以下に記載するいずれかの方法によって、ウィンドウのリサイズによって呼び出されるメソッドを設定することができます。

1. NSWindowDelegateを使用

ウィンドウに NSWindowDelegate を設定すると、そのメソッド windowDidResize がリサイズによって呼び出されることを利用します。

例えば、以下のように AppDelegate を変更します。

AppDelegate.swift

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        NSApp.windows.first?.delegate = self
    }

    func windowDidResize(_ notification: Notification) {
        // ウィンドウがリサイズされたときの処理
        print("resized")
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        
    }
}

2. NotificationCenterを使用

NotificationCenter によって NSWindow.didResizeNotification による通知を受け取ります。

以下のように、設定した任意のメソッド(resized)をウィンドウのサイズ変更に応じて呼び出すことができます。

ViewController.swift

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(self.resized),
                                               name: NSWindow.didResizeNotification, object: nil)
    }
    
    @objc func resized() {
        // ウィンドウがリサイズされたときの処理
        print("resized")
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }
}

以上、ウィンドウのリサイズに応じた処理を実行する方法についてでした。

コメントを残す

メールアドレスが公開されることはありません。