Storyboardで8種類のUIGestureRecognizerを使う

2016.10.29
UIGestureRecognizerのStoryboardでの使い方の記事のアイキャッチ

こんにちは、プログラマーの@Yuuです。

前回はswiftで8種類のUIGestureRecognizerを使う方法をご紹介しました。

しかし、UIGestureRecognizerはSwiftやObjective-Cと言ったコードを使わなくてもstoryboardから簡単に設定が出来ます。
そこで今回は、storyboardからUIGestureRecognizerを使う方法をご紹介します。

スポンサーリンク

UIGestureRecognizerとは

UIGestureRecognizerについては、前回の記事(Swiftで8種類のUIGestureRecognizerを使う方法)で丁寧に書いているので今回はザックリと。

「ピンチイン・ピンチアウト・長押し」と言った、iPhoneで扱える様々なジェスチャーを扱えるようにするクラスが「UIGestureRecognizer」です。

UIGestureRecognizerクラスを継承したUITapGestureRecognizerクラスなどを、オブジェクト(UIViewUILabelなど)に対して使用する事で様々なジェスチャーを扱えるように出来ます。

前回の記事と同じく、以下8種類(ダブルタップを1つとカウント)のジェスチャーについてstoryboardを使用して扱えるようにする方法をご紹介します。

クラス名 ジェスチャー
UITapGestureRecognizer タップ・ダブルタップ
UIPinchGestureRecognizer ピンチ
UIPanGestureRecognizer パン(ドラッグ)
UISwipeGestureRecognizer スワイプ
UIRotationGestureRecognizer ローテイト
UILongPressGestureRecognizer ロングプレス
UIScreenEdgePanGestureRecognizer エッジ

UIGestrueRecognizerを使う

タップ・ダブルタップ(UITapGestureRecognizer)

タップされた時は「single」・ダブルタップの時は「double」とログに出力されるようにします。

まず2つのTap Gesture RecognizerをViewに配置。
2つのTapGestureを配置

ダブルタップの方に設定するRecognizerだけTapsの値を変更します。
ダブルタップのGestureのTapsの値を変更

「Tap」のとなりにある「Touches」の値を変更すると、指定した本数以上の指でタップしないと反応しなくなります。
つまり「Touches」の値を「2」に変更すれば、2本指でタップしないと反応しなくなるという事です。

それぞれのTap Gesture Recognizerを「@IBOutlet」「@IBAction」としてViewControllerに紐付けます。
OutletとAction両方を紐付ける

最後にviewDidLoad()内に以下の1文を追加し、ダブルタップの時にはシングルタップを反応させないようにします。
Swift2.2以前の場合は上のコメントアウトしてある方を書いて下さい。

全文表示すると

ピンチ(UIPinchGestureRecognizer)

ピンチイン・ピンチアウトをする際に以下の2種類の値を取得出来ます。

  • scale・・2つのタッチポイントの相対的な拡大縮小率
  • velocity・・1秒あたりのピンチの速度

ここではピンチイン・ピンチアウトされた時に「scale」と「velocity」をログとして出力してみます。

Pinch Gesture RecognizerをViewに設定します。
Pinch Gestureを登録

IBActionでpinchをViewControllerに紐付けます。
IBActionでPinchGestureを紐付ける

あとはViewController側にピンチを行った時のアクションを記述します。

この「UIPinchGestureRecognizer」を使うと、よくある写真をピンチイン・ピンチアウトして拡大縮小表示するような事が出来ます。

以下のページが参考になりそう。

パン(UIPanGestureRecognizer)

パンはドラックの事で、translation(in:)を使う事で移動後の相対位置を取得出来ます。

ここではパンを実行された時にtranslationの値を表示してみます。

ピンチの時と同じように「Pan Gesture Recognizer」をViewに設定し、IBActionを設定します。
Pan Gestureを登録する

ViewControllerを以下のように書き換えます。

スワイプ(UISwipeGestureRecognizer)

レフトスワイプ・ライトスワイプそれぞれを取得してみます。

Swipe Gesture Recognizerを2つViewに配置します。
Swipe Gestureを2つviewに登録

配置したそれぞれのSwipe Gesture RecognizerにSwipeの方向(direction)をStoryboardから設定します。
Gestureに対してdirectionを設定

あとはそれぞれをIBActionで繋ぎます。
ViewControllerの全文は以下のとおり。

ローテイト(UIRotationGestureRecognizer)

ローテイトをする際に「rotation」「velocity」の値を取得する事が出来ます。

  • rotation・・回転した角度(ラジアン)
  • velocity・・スピード(ラジアン/秒)

ここではローテイト実行時にrotationvelocityの値を表示するようにします。

Rotation Gesture RecognizerをViewに設定。
Rotation Gestureをviewに登録

今までと同じようにViewControllerにアクションを設定。

ロングプレス(UILongPressGestureRecognizer)

ロングプレスは長押しの事。
そのまんまですね。

Long Press Gesture Recognizerをviewに登録。
LongPressGestureをviewに登録

登録したLong Press Gesture Recognizerの「Attributes inspector」で、
最低何秒押された場合ロングプレスとするか(minimumPressDuration
ロングプレス中の指が動いていい範囲(allowableMovement)を指定する事が出来ます。
ロングプレス時の詳細設定

ViewControllerにアクションを設定。

エッジ(UIScreenEdgePanGestureRecognizer)

エッジは画面端をスワイプするアクション。
ブラウザなどで画面左端をスワイプして前のページに戻ったり、画面下からスワイプして通知センターを表示する際にも、このアクションが使われています。

Screen Edge Pan Gesture Recognizerをviewに登録。
EdgeGestureをviewに登録

Edgeの方向は「Attributes inspector」で変更出来ます。
Edgeに対応させる場所を設定

ViewControllerにアクションを設定。

あとがき

コードで書くよりもstoryboardを使った方がコードの可読性は良くなりますね。

普段から積極的にstoryboardを使う身として、今後はstoryboard上でUIGestureRecognizerの登録をするようにしようと思います。

使い勝手も悪くありませんしね!

ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧

2016.11.13追記
UIGestureRecognizerが使えない起きた時の対処法の記事を書きました。
エラーが起きた際には参考にしてみて下さい。

UIGestureRecognizerのStoryboardでの使い方の記事のアイキャッチ

この記事が気に入ったらいいね!
して最新情報をチェックしよう!

スポンサーリンク