タッチの利用
iOSアプリでは、UIViewクラス単位でタッチを検出してタッチ時の処理を行うことも可能です。前項までで紹介した方法以外で、単純なタッチに対する処理はタッチを利用して行うことができます。ビューコントローラーの画面もUIViewクラスですので、画面全体に対するタッチ等も容易に実装できます。
タッチイベントを利用する
UIViewクラスは、画面のタッチや端末のシェイク等のイベントを管理するUIResponderクラスを継承しています。UIResponderクラスのメソッドでタッチ時に発生するイベントを検出でき、イベントが発生した際の処理を行うことができます。UIResponderクラスのタッチを検出するメソッドには次のものがあります。
名前 | 概要 |
---|---|
touchesBegan(_:withEvent:) | タッチ開始時の処理を指定 |
touchesMoved(_:withEvent:) | タッチ中の処理を指定 |
touchesEnded(_:withEvent:) | タッチ終了時の処理を指定 |
各メソッドとも引数は同じで、記述する際にはoverrideをつけます。touchesBegan(_:withEvent:)メソッドを例にすると、書式は次のようになります。
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { // 処理を記述 }
メソッド実行時に、タッチ情報を管理するUITouchオブジェクトが集合を表すNSSetオブジェクトとして、発生したイベントがUIEventオブジェクトとして得られます。具体的な利用例は次の通りです。
// タッチ開始時 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { var touch = touches.anyObject() as UITouch // NSSetの中からUITouchオブジェクトを取得 var nowP : CGPoint = touch.locationInView(self.view) // UITcouhの位置を取得 SampleView.center = nowP // タッチした場所に矩形を表示 if SampleView.hidden { SampleView.hidden = false; } } // タッチ中 override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { var touch = touches.anyObject() as UITouch var nowP : CGPoint = touch.locationInView(self.view) // 現在タッチした位置 var oldP : CGPoint = touch.previousLocationInView(self.view) // 前回タッチした位置 var deltaX : CGFloat = nowP.x - oldP.x // 2点の差を現在の矩形の位置に加算して var deltaY : CGFloat = nowP.y - oldP.y // 指が移動した位置に矩形を表示 SampleView.center = CGPointMake(SampleView.center.x + deltaX, SampleView.center.y + deltaY) } // タッチ終了時 override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { if(!SampleView.hidden){ SampleView.hidden = true; } // 矩形を非表示にする }
各メソッドでタッチ情報はNSSetオブジェクトで渡されますので、NSSetのanyObject()メソッドでその中の1つのタッチ情報を取り出します。タッチされた位置を得るには、UITouchオブジェクトのlocationInView(_:)メソッドを利用して、配置されているビュー内のCGPointオブジェクトを参照します。実行結果は次の通りです。
タッチ開始時にタッチされた場所に矩形を表示します。タッチしたまま指を動かすと、その動きに矩形がついていきます。指を離すと矩形を非表示にします。
タップの回数/タッチした時間に応じて処理を行う
間髪を入れずにタッチを行なった場合、touchesBegan(_:withEvent:)メソッドで複数のタッチを検出することができます。タッチの個数はUITouchオブジェクトのtapCountプロパティで参照できます。また、タッチイベントが発生した日時は、タイムスタンプとしてUIEventオブジェクトのtimestampで参照できます。これらのプロパティを利用することで、タップの回数やタッチの長さに応じて処理を行うことも可能です。
// タッチ開始時 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { var touch = touches.anyObject() as UITouch var count : Int = touch.tapCount // タッチの回数を取得 label.text = "\(count)" time = event.timestamp // イベントのタイムスタンプをshutoku } // タッチ終了時 override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { var diff : NSTimeInterval = event.timestamp-time! // タッチ開始時と終了時のタイムスタンプの差を取得 if diff < 0.5 { timeLabel.text = "Short Tap" }else{ timeLabel.text = "Long Tap" } }
UIResponderクラスのメソッドを利用することによって、ダブルタップ等の連続したタップや長押しがなされた場合の処理を行うことができます。実行結果は次の通りです。
まとめ
今回はアプリの動作時の処理にいて基本的な説明を行いました。次回は、SwiftからObjective-Cを呼び出す方法とObjective-Cで作成されているライブラリの利用の仕方について説明します。