Posted at

borderless な NSWindow でテキスト入力を有効化する

More than 1 year has passed since last update.

1時間くらいハマった上に,日本語情報としてはまだないようなので,メモを残します.

NSWindow は,以下のようにスタイルを設定することで borderless,すなわち,タイトルバー等を除去することができます.

let window = NSWindow()

window.styleMask = [.borderless]

しかし,borderless な NSWindow に対しては,デフォルトでキー操作が無効になってしまうようです.すなわち,そのような NSWindow 上に NSTextField 等の入力可能な要素を配置しても,キー入力を受け付けないために,編集できません.


By default, borderless windows cannot become key.

objective c - NSTextField not editable in custom NSWindow - Stack Overflow


公式にも記述がありました.


The value of this property is true if the window has a title bar or a resize bar, or false otherwise.

canBecomeKey - NSWindow | Apple Developer Documentation


これを解決するためには,NSWindow クラスを継承したクラス内で,canBecomeKey プロパティを true に設定する必要があります.先ほどの参照先は Objective-C のコードですが,Swift では以下のように記述できます.


class PPWindow: NSWindow {

override var canBecomeKeyWindow: Bool {
return true
}
}

xcode - How to set canBecomeKeyWindow? - Stack Overflow


以上です.