クリアメモリ

プログラミングやモーショングラフィックス、便利なアプリケーションなど雑多に記録するブログ

【Swift】クリックイベントから座標を取得するclickUpの使い方

f:id:clrmemory:20170422184225p:plain 

先日、キー入力イベントを取得して処理を追加する方法を紹介しました。

似たような方法で、キー入力ではなく「クリック時」のイベントを取得することもできるので今回はクリックイベントからその座標を取得するOSXアプリの作り方を紹介します。

 

 

はじめに

 

今回紹介する方法ではCocoa Programmingで、使用言語はSwiftになります。

また、XcodeからOSXアプリを作成するため、Xcode以外では同じようにできないので注意してください。

 

ではまず、今回作成するOSXアプリの実際の動作を確認してみましょう。

 

 

このようにクリックしたイベントを取得して、その座標をラベルに表示してみました。詳しくは後述していますが、クリックイベント発火はmouseUpというメソッドで取得できます。

 

同じような方法で、キーボード入力のイベントも取得できるのですが、その方法についてはこちらから確認してください。

 

https://clrmemory.com/swift/cocoa-keyboard-event/

 

ではまず、簡単なストーリーボードの作成から見ていきましょう。

 

ストーリーボードを作成

 

今回のOSXアプリで使用するストーリーボードには、X座標を表示するラベルとY座標を表示するラベルだけを配置してみました。以下を参考にしてストーリーボードを作成してください。

 

 

これらのラベルは左揃えで設置してみました。

 

 

画像を参考にして、Alignmentを左に設定するとラベルの文字数が変わっても、常に左から詰めて表示できるようになります。今回のクリックイベント検知とは関係ありませんが、とりあえず覚えておきましょう。

 

また、作成したOSXアプリのウィンドウサイズを変更した時に、常に下部分にラベルを表示するために「オートレイアウト」を設定しておきました。

 

 

yのラベルも同様に設定してあります。

これでストーリーボードが完成しました。

 

クリックイベントを取得

 

では今回開発するOSXアプリのメインになる「クリックイベント」を取得する方法を見ていきましょう。今回はクリックされた座標を取得するため、以下のコードを書いてみました。

 

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var xField: NSTextField!
    @IBOutlet weak var yField: NSTextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

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

    override func mouseUp(with event: NSEvent) {

        let clickPos = CGPoint(x: event.locationInWindow.x, y: event.locationInWindow.y)

        xField.stringValue = "x >> \(clickPos.x)"
        yField.stringValue = "y >> \(clickPos.y)"

    }
}

 

xField…ストーリーボードで作成したXラベル

yField…ストーリーボードで作成したYラベル

これらはそれぞれセグエでアウトレット接続されています。

 

では実際に動作を確認してみましょう。

 

 

クリックしたらラベルの値が更新され、イベントが発生した座標が表示できたかと思います。また、ストーリーボードからオートレイアウトの設定を行ったので、ウィンドウを拡大しても下部にラベルが表示されていると思います。

 

 

座標は左下が(0, 0)になり、右上が(ウィンドウ幅, ウィンドウ高さ)になります。このようにウィンドウサイズを広げると、右上の座標の値も増加しているのがわかりますね。

 

では解説していきます。

Cocoaアプリ(Swift)でクリックイベントを取得するために必要なコードは「mouseUp」です。このような処理を記述することで、クリックイベントが取得できました。

mouseUpは「マウスのクリックを離した時」にイベントが発火されるので、マウスをクリックした瞬間やドラッグ中には呼び出されません。もしクリックした瞬間にイベントを発火させたい場合は「mouseDown」を使いましょう。

 

ここで実際に発生したイベントは「event」から呼び出すことができます。

 

今回の場合、クリックされたX座標とY座標を取得するため、event.locationInWindow.xとevent.locationInWindow.yの記述をしてそれぞれの座標を取得しました。最後にここで取得した座標をラベルにそれぞれ適用させています。

これで、クリックイベントが発生した座標を取得して、ラベルで表示できるはずです。

 

まとめ

 

今回紹介した方法を使えば、クリックが発生したイベントを検知して座標を取得するOSXアプリを作ることができます。クリックイベントが発生した場所にオブジェクトを表示するというようなアプリを作る時に活用してみてください。

 

ではまた。