【Swift & uikit】画面タップの検知をカウントしてその回数を画面にリアルタイム表示する

電波人間のイラスト

最近MacBookAirを買ったので、どうせならiOSアプリを作ってみたいと思い、XcodeとSwiftについていろいろ調べています。

今回は、画面タップを検知する方法について少しわかった気がするので、それについて書いていきます。

【Swift & uikit】画面タップの検知をカウントしてその回数を画面にリアルタイム表示する

Swiftで画面のタップを検知したときに何らかの処理を走らせたいときは、「UITapGestureRecognizer」が使えるみたいです。

が、まずはその前に実際の画面のイメージをお見せします。

実際の画面

UITapGestureRecognizerを使用したコードの一例

実際のコードが次の通りです。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tapCounter: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(ViewController.tapped(_:)))

        self.view.addGestureRecognizer(tapGesture)
    }

    @objc func tapped(_ sender: UITapGestureRecognizer){
        if sender.state == .ended {
            self.tapCounter.text = String(Int(self.tapCounter.text ?? "0")! + 1)
        }
    }
}

コードの説明

UIKitフレームワークのインポートします。

画面操作や表示とシステムのつながりを管理するための機能があります。

import UIKit

View操作の役割を持つViewControllerクラスを継承し、サブクラスUIViewControllerを定義します。UIViewControllerでさらに2つの関数を定義します。

1つは、画面が表示されたときに呼ばれるviewDidLoad()です。これはViewControllerのものをオーバーライドして定義します。

もう1つは、タップされたときに呼ばれる関数tapped()です。ここにタップされたときの処理を書きます。

それぞれの処理内容は後述します。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @objc func tapped(_ sender: UITapGestureRecognizer){
    }
}

viewDidLoad()では2つの処理を行います。

1つはタップされた時のイベント宣言です。UITapGestureRecognizerのインスタンスを作り宣言します。

タップされたときにUIViewControllerクラスのtapped()を実行するようにパラメータを設定します。

そして、その宣言した内容をviewに追加します。

「#sender:」の意味ですが、tapped()をbjective-Cの関数として定義するために書く必要があるみたいです。

UITapGestureRecognizerはUIKitの機能ですが、UIKitではイベント処理の定義にObjective-CのAPIであるtarget-actionが利用されるようです。

そのため、自前のイベント処理を定義するときもそのように定義するため、「#sender:」の記載が必要になります(あまり分かっていない)。

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(ViewController.tapped(_:)))
        
        self.view.addGestureRecognizer(tapGesture)
    }

tapped()はタップされたときに行う処理を書きます。

今回の内容ですと、タップの終わり(指が画面から離れた)かを判定し、そのときは画面にあるラベルのテキストを1加算しています。

ラベルのテキストは標準だとString型なので、Intでキャストしてから加算ています。

加算した値をラベルのテキストに戻すときはString型でキャストし、元の型に戻してから行います。

「@objc」は、bjective-Cを表しています。

    @objc func tapped(_ sender: UITapGestureRecognizer){
        if sender.state == .ended {
            self.tapCounter.text = String(Int(self.tapCounter.text ?? "0")! + 1)
            
        }
    }

まとめ

以上がSwiftとuikitで画面タップの検知をカウントしてその回数を画面にリアルタイム表示する方法です。

これはuikitを使った方法ですが、どうもSwiftUIなるものでも同じようなことができるらしいです。

そっちはまだよく分からないので割愛。それも試してみて

[SwiftUI] onTapGestureのタップ検知領域を画面全体にする

SwiftUIのonTapGestureでタップを検知する領域を画面全体にするのに手こずりました。 あまりしっくりきていないのですが、一応画面全体でタップを検知する事のできるコー…