69374


SwiftにてTextField を画面いっぱいに 広げ どこをタップしてもキーボードが立ち上がるようにすることは可能でしょうか ？


CC BY-SA 4.0
2020-07-03T08:07:38.597
68243
2020-08-08T20:59:38.097
39481
question
swift
Swift TextField を画面いっぱいに


「どこをタップしてもキーボードが立ち上がるようにする」が、質問の主旨であるという前提で、回答をいたします。  
「キーボードが立ち上がる」というアプリの挙動は、プログラマ側から見れば、
**`UITextView`、`UITextField`などの、ユーザがテキスト入力を行うViewに、フォーカスが当たる**という表現になります。それをコードで表現すると、こうなります。仮に`UITextField`のインスタンス`textField`に入力のフォーカスを当てる場合、

[code]

    textField.becomeFirstResponder()
    
[/code]

とコードを書きます。  
キーボードを閉じる時、入力のフォーカスが、`textField`にあるとすると、

[code]

    textField.resignFirstResponder()
    
[/code]

と書くのは、よく知られたTipsですが、それと対をなすメソッドということができるでしょう。

さて、次に「どこをタップしても」の部分について考えてみようと思います。  
これについては、 **Responder Chain** という、UIKitに含まれる機能について、学習する必要があります。

[Article - Using Responders and the Responder Chain to Handle
Events](https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_the_responder_chain_to_handle_events)

（以下は、上のリンク先をひととおり目を通された前提で、話を進めます）  
ユーザが起こしたタッチイベントが、Viewの間を次々に伝播していくのが、Responder
Chainのメカニズムですが、iOSの場合、最初にユーザのタッチイベントを受け取った、ボタン、スイッチ、Text
Fieldなどが、処理をしてしまうので、「イベントの伝播」が生じないケースがほとんどです。なので、Responder
Chainをよく知らない、あるいはまったく知らない人が多いのは、しかたないかも知れませんが、今回のケースでは、大事なポイントです。  
ユーザのタッチイベントは、それを受け取って、処理するViewがなければ、次々と伝播していって、`UIViewController`のサブクラスに到達します。これは、つまり`UIViewController`のサブクラスに、ユーザのタッチイベントを受け取って処理するメソッド（`func
touchesBegan(_ touches: Set<UITouch>, with event:
UIEvent?)`など）を記述しておけば、画面上のどこをタップしても、そのメソッドが実行されるということでもあります。

以上、`becomeFirstResponder()`と、Responder Chainの二つを組み合わせます。

`UIViewController`のサブクラスに、次のコードを記述します。仮に`UITextField`のインスタンスを`textField`とすると、

[code]

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        textField.becomeFirstResponder()
    }
    
[/code]


CC BY-SA 4.0
2020-08-08T20:59:38.097
69374
2020-08-08T20:59:38.097
18540
68243
answer