【Swift】 ウィンドウをドラッグして移動させる!どこでもドラッグできるようになる!

f:id:clrmemory:20170422183815p:plain 

Cocoa MacOSXアプリ開発をしていて、iOSと違う点が「ウィンドウがある」というところだと思います。ウィンドウを移動させる時、普段であればタイトルバーをドラッグすると思いますが、処理を記述することでウィンドウの背景のどこをドラッグしても移動できるようにできます。

 

そこで今回はウィンドウをドラッグして移動させる方法を紹介します。

 

 

はじめに

 

今回紹介する方法は、Cocoa MacOSXアプリで、言語は「Swift3」で開発を行っていきます。

また、Xcodeを使用しているため、あらかじめインストールなどは済ませておいてください。

ではまず、移動させるためのウィンドウがあるアプリから作成していきましょう。今回は以下のようなウィンドウを作成してみました。

 

 

実際の動作を動画にしてみたので、こちらも確認しておくと開発の流れがわかりやすくなるかもしれません。

 

何の変哲も無いアプリですが、こちらのウィンドウの「Hello World!!」の背景部分をドラッグしてもウィンドウの位置を移動できるようにしてみましょう。

ちなみに、こちらのアプリケーションは「WindowController」で作成しています。ではストーリーボードを作っていきます。

 

ストーリーボードを作成

 

前述の通り、今回使用するアプリは「WindowController」を使用します。

Cocoaアプリの場合、ストーリーボードを使用してプロジェクトを作成すると以下のようなWindowControllerが配置されていると思います。

 

 

これがWindowControllerですので、このような配置になっていればOKです。

では続いて、WindowControllerに処理を追加する「カスタムクラス」を作成します。File > New > File からか、command + n で新規ファイルを追加しましょう。

 

 

今回追加したカスタムクラスは「WindowController」という名前で作成してみました。

 

 

Class : WindowController

SubClass… NSWindowController

 

SubClassが「NSWindowController」に変更されている点に注意してください。

また、「Also create XIB file for user interface」 のチェックは外しておきましょう。

 

続いて、作成したWindowControllerクラスを、ストーリーボードのWindow Controllerに設定しましょう。以下を確認してください。

 

 

Window Controllerを選択した状態で、Identity inspectorを開いてください。以下を参考にして「Custom Class」に先ほど作成した「WindowController」を設定しましょう。

 

 

これで、Window Controllerにサブクラスを追加できました。

ではいよいよ「ウィンドウのどこをドラッグしても移動できる」ようにしていきましょう。

 

背景をドラッグで移動

 

先ほど作成した「WindowController」を開いてください。

 

import Cocoa

class WindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
    }

}

 

初期状態ではこのようになっていると思います。

もし、NSWindowControllerではなく、NSViewControllerなどになっている場合は書き換えることで、Window Controllerのサブクラスにできるはずです。

 

ではこのコードの中に、ウィンドウをドラッグで移動する処理を書きましょう。ウィンドウをドラッグ移動する時に使用するコードは以下になります。

 

window?.isMovableByWindowBackground = true

 

読んで字のごとくですが、windowのisMovableByWindowBackgroundに「true」を与えることで、ウィンドウをドラッグ移動できました。

実際にviewDidLoad( )の中に記述したのが以下コードです。

 

import Cocoa

class WindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()

        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.

        window?.isMovableByWindowBackground = true
    }

}

 

たったこれだけで、ウィンドウのドラッグ移動が可能になりました。

実際にビルドしてみてください。

 

 

今回はわかりやすいように、タイトルバーを非表示にした状態で移動できるようにしました。

タイトルバーが無いアプリでも、ウィンドウの配置を移動できたと思います。

 

まとめ

 

今回紹介した方法を使うことで、ウィンドウのどこをドラッグしても移動できるようになりました。isMovableByWindowBackground = trueにするだけで、Macアプリならではのウィンドウがあるアプリの移動に使えるのでぜひ試してみてください。

 

ではまた。

新着記事