🦋

SwiftUI: NSHostingViewでacceptsFirstMouse(for:)を有効にする

2023/02/04に公開

ウインドウからフォーカスが外れた後にウインドウをクリックした際、一度フォーカスを取り戻してからもう一度クリックするとイベントが発火するのがデフォルトの挙動ですが、NSViewのもつacceptsFirstMouse(for:)trueを渡してあげると一度目のクリックからイベントが発火するようになります。しかし、SwiftUIのViewの場合はこのオプションがないためNSHostingView経由の時はどうするんだと実験してみてやり方がわかりました。

class MyHostingView<T: View>: NSHostingView<T> {
    override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
        return true
    }
}

要はNSHostingViewを継承したサブクラスを作り、acceptsFirstMouse(for:)overrideしてあげればいいだけです。ウインドウのcontentViewにこれを代入します。

Discussion