見出し画像

【徒然iOS】気ままにUIKit64〜Tap Gesture Recognizer キーボード以外の場所をタップしてキーボードを閉じる〜

概要

このマガジンは四十を過ぎたおっさんが、

を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。

今回

をハイ、レッツゴ🕺

前準備

念の為、

  1. バックアップ

  2. 新しいクラス

  3. ビューコントローラの追加

  4. イニシャルビューの変更

をいつも通りやってから本題へ💃

こんな感じかな💦

本題

⒈ラベルとテキストフィールドを配置して、アウトレット接続

選んで〜〜〜
配置
選んで〜〜〜
配置
ラベル接続〜〜〜
テキストフィールド接続〜〜〜
ハイ、接続完了🕺

⒉タップリコグナイザーを配置して、アウトレットとアクション接続

選んで〜〜〜
配置完了🕺
アクション接続
完了🕺
続けてアウトレット接続👀
完了🕺

⒊ダブルタップ用のタップリコグナイザーを配置して、アウトレット接続

選んで配置〜〜〜
アウトレット接続〜〜〜
完了🕺

⒋2個目のTapGestureの設定を2に〜〜〜

ココな👀

⒌コード組み込み

//
//  ViewController.swift
//
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var testLabel: UILabel!
    @IBOutlet weak var testTextField: UITextField!
    @IBOutlet var doubleRecognizer: UITapGestureRecognizer!
    @IBOutlet var singleRecognizer: UITapGestureRecognizer!
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        //デリゲート先を自分に設定する。
        testTextField.delegate = self
        //ダブルタップに失敗したときのみシングルタップの検知を有効にする。
        singleRecognizer.requireGestureRecognizerToFail(doubleRecognizer)
    }
    //シングルタップ時の呼び出しメソッド
    @IBAction func tapView(sender: UITapGestureRecognizer) {
        //テキストフィールドの文字列をラベルに設定する。
        testLabel.text = testTextField.text
        //キーボードを閉じる。
        view.endEditing(true)
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        //テキストフィールドの文字列をラベルに設定する。
        testLabel.text = testTextField.text
        //キーボードを閉じる。
        view.endEditing(true)
        return true
    }
}

を参考に👀

今回のコード(まとめ)

class TapRecognizerViewController: UIViewController, UITextFieldDelegate {
    
    @IBOutlet weak var myLabel: UILabel!
    @IBOutlet weak var myTextField: UITextField!
    @IBOutlet var singleTap: UITapGestureRecognizer!
    @IBOutlet var doubleTap: UITapGestureRecognizer!
    
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        //デリゲート先を自分に設定する。
        myTextField.delegate = self
        //ダブルタップに失敗したときのみシングルタップの検知を有効にする。
        singleTap.require(toFail: doubleTap)
    }
    //シングルタップ時の呼び出しメソッド
    @IBAction func myTapView(_ sender: UITapGestureRecognizer) {
        //テキストフィールドの文字列をラベルに設定する。
        myLabel.text = myTextField.text
        //キーボードを閉じる。
        view.endEditing(true)
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        //テキストフィールドの文字列をラベルに設定する。
        myLabel.text = myTextField.text
        //キーボードを閉じる。
        view.endEditing(true)
        return true
    }
}

⒍シミュレータで実行

で入力して〜〜〜
確かにTapで閉じたね🕺

実機でも一応確認したけど、確かにダブルタップでは反応しないね👀
てか、

今回のポイント

そんなにダブルタップでしかキーボードを閉じられないなんて、、、

ユーザーさんが戸惑わせないようにするのに、
アラートなんかで説明が別途必要な仕様なんていらない
👉シングルタップでも閉じる仕様で個人的には十分🕺

*設定項目

Tapsは検知対象とする連打回数。
Touchesは同時に触れている指の数。

サイト記事は以上🕺

ブラッシュアップ

今回は、AutoLayoutのみ

黄色コンフリクトを押すと、こんな吹き出しが出てくるので
confirmをクリック〜〜〜〜
ハイ、解消出来た🕺

Apple公式

さて次回は、

をレッツゴする🕺

この記事が気に入ったらサポートをしてみませんか?