[Swift3対応]8種類のUIGestureRecognizerを使う

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

こんにちは、Swift3が出て1年前のプロジェクトを開くのが怖い@Yuuです。
Swift→Swift2になった時に自動変換機能を使うのを忘れて、1000個以上のエラーが出たのを思い出してガクブル中です...
(((;゚Д゚)))

さて今回は、様々なジェスチャーを扱えるようにする事が出来る「UIGestureRecognizer」のご紹介。

解説を行う環境は以下のとおりです。
Swift3での紹介ですが、この記事を書いている頃はまだXcode8になったばかりなので、Swift2での書き方も一緒にご紹介していきます。

  • OS:macOS Sierra 10.12
  • Xcode:8.0
  • Swift:3.0

スポンサーリンク

UIGestureRecognizerとは

そもそもジェスチャーて何?という話からすると、

  • タップ・ダブルタップ
  • ピンチイン・ピンチアウト
  • 長押し
  • スワイプ

のような、指で画面を操作するアクション全般のことを言います。

画像を長押ししたり、地図やブラウザでピンチイン・ピンチアウトしたり...
皆さんも当たり前のように使っている機能ではないでしょうか。

そして、これらジェスチャー全般を扱えるようにするクラスとして「UIGestureRecognizer」が用意されていて、更にそのサブクラスとして6種類のジェスチャーを扱えるクラスが用意されています。

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

例えば「UITapGestureRecognizer」を使用すると、UIViewUILabelのようなそのままではタップを検出出来ないオブジェクトに対して、タップを可能に出来ます。

「UITapGestureRecognizer」については以前詳しく解説しているので、もし興味があれば見てみて下さい。

[swift]ボタン以外もタップ出来るようにするUITapGestureRecognizer

お手軽!storyboardでUITapGestureRecognizerを設定する

この記事では以下8種類(ダブルタップを1つとカウント)のジェスチャーを、swiftで扱えるようにする方法をご紹介します。

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

1番下のエッジ(Safariなどで画面端をスワイプする事で戻れるアクションの事)だけ特殊で、「UIGestureRecognizer」のサブクラスの「UIPanGestureRecognizer」の更にそのサブクラスの「UIScreenEdgePanGestureRecognizer」を使用します。

ジェスチャーを扱う

ではそれぞれのジェスチャーを扱う方法を見ていきます。

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

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

注意が必要なのは14行目と18行目。
14行目はコメントアウトしてますが、このコメントアウトを外すと2本指じゃないとタッチが反応しません。

また18行目を設定しないとダブルタップの時でもシングルタップのアクションが実行されてしまいます。

ピンチ(UIPinchGestureRecognizer)

ピンチイン・ピンチアウトをする際に「scale」「velocity」の値を取得する事が出来ます。

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

scaleの「タッチポイントの相対的な拡大縮小率」てなんじゃそりゃ?と思ったのですが、ピンチが検知された瞬間の指と指の距離を1とした拡大縮小率を取得するという事のようです。

以下のページが参考になりました。
【Swift】Pinch Gesture Recognizerの使い方。2つの指で部品を拡大縮小する。

ピンチイン・ピンチアウトを取得する方法は以下のようになります。

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

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

パン(UIPanGestureRecognizer)

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

スワイプ(UISwipeGestureRecognizer)

スワイプはdirectionでスワイプの方向を設定します。
また、タップの時のようにnumberOfTouchesRequiredで何本指以上の場合にスワイプに反応するかも定義出来ます。

ローテイト(UIRotationGestureRecognizer)

ローテイトは2本指で回転させた際のアクションです。

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

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

ロングプレス(UILongPressGestureRecognizer)

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

minimumPressDurationで最低何秒押された場合ロングプレスとするかを、
allowableMovementでロングプレス中の指が動いていい範囲をpxで指定する事が出来ます。

エッジ(UIScreenEdgePanGestureRecognizer)

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

あとがき

UIGestureRecognizerのサブクラス8種類の使い方をザックリ書いてみました。
UIGestureRecognizerは何かと使う場面があるので、参考になれば幸いです。

次はstoryboardを使ってUIGestureRecognizerを使用出来るようにする記事を書こうと思っているので、storyboardを使ってコーディングされる人はぜひ読んでみて下さい!

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

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

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

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

スポンサーリンク