[swift]ボタン以外もタップ出来るようにするUITapGestureRecognizer
こんにちは、プログラマーの@Yuuです。
UIButtonにはボタンをタップされた時の処理を簡単に書くことが出来ますが、UIViewをタップされた時の処理は簡単に実装する事が出来ません。
UIViewやLabelに対してタップされた事を判定させるためには「UITapGestureRecognizer」というものを使用する必要があります。
公式サイト↓
UITapGestureRecognizer Class Reference
ちなみに「UITapGestureRecognizer」はジェスチャー全般を取り扱う事が出来る「UIGestureRecognizer」を継承したクラスになります。
「UIGestureRecognizer」を使った場合は以下のようなアクションに対応させる事が出来ます。
- ピンチ
- パン
- スワイプ
- ローテート(回転)
- ロングプレス(長押し)
- エッジ
パンはドラックのこと。
エッジは画面の左端をスワイプすることで前の画面に戻れたりするアレです。
(´-`).。oO(「前の画面に戻れたりするアレ」ていう以外になんて説明すればいいんだろう・・)
今回はコードベースで「UITapGestureRecognizer」を使用する方法を解説します。
ピンチ・パンなどのアクションの実装するための「UIGestureRecognizer」はまた他の記事でご紹介しますね。
2016.11.13追記
8種類のUIGestureRecognizerの記事を追加しました!
Swiftで使う場合、storyboard使う場合の2記事あるので、良ければ参考にして下さい。
今回の解説を行う環境は以下になります。
- OS:OS X El Capitan10.11.5
- Xcode:7.3.1
- Swift:2.2
スポンサーリンク
Viewをタップ出来るようにする
viewをタップされたらログに「タップされました」と表示しつつ、画面全体の背景色を青・緑に点滅するようにします。
プロジェクトの用意
SingleApplicationでプロジェクトを作成します。
ViewController.swiftを以下のように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // タップを定義 let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.viewTap(_:))) // viewにタップを登録 self.view.addGestureRecognizer(tap) // 背景色を変更 self.view.backgroundColor = UIColor.blueColor() } /// viewをタップされた時の処理 func viewTap(sender: UITapGestureRecognizer){ print("タップされました") // 背景色が青の場合は緑に、緑の場合は青に変更する if self.view.backgroundColor == UIColor.blueColor() { self.view.backgroundColor = UIColor.greenColor() }else { self.view.backgroundColor = UIColor.blueColor() } } } |
9行目のタップを定義する方法はSwift2.2以降の書き方です。
Swift2.2以前は
let tap = UITapGestureRecognizer(target: self, action: Selector("viewTap:"))
と書く必要があったため、「""」のメソッド名をタイプミスしても気付かなかったわけですが、Swift2.2以降はタイプミスをすると以下のように警告が出てくれるので便利ですね!
12行目で最初から配置されているviewに対してタップされた時のアクションを登録しています。
例えばこれをUIImageViewで書く場合は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class ViewController: UIViewController { // storyboardと紐付けたimageView @IBOutlet weak var myImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // タップを定義 let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.viewTap(_:))) // imageViewにタップを登録 self.myImageView.addGestureRecognizer(tap) // 背景色を変更 self.view.backgroundColor = UIColor.blueColor() } ・・・ 省略 ・・・ |
13行目のように書けばimageViewもタップする事が出来るようになります。
そしてこれを実際に実行すると
このようにviewをタップして反応するようになりました!(๑•̀ㅂ•́)و✧
もしここまで試して反応がなかった場合は以下の記事も参考にして下さい。
あとがき
viewやimageをタップされた時に何かしらアクションを実行したい!という事は結構あるので、UITapGestureRecognizerは意外と使う機会が多い気がします。
今回はコードベースでUITapGestureRecognizerを使えるようにしましたが、次はStoryboardから実行出来るようにするやり方を書こうと思います。
ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧