質問: 現在iOSアプリの開発をしているのですが、とある状況の時にタップ判定が上手く機能しなくて困っています。 まず画面構成が少し複雑で以下のようになっています。 (わかりづらくてすみません...) * 全体を囲うUIViewControllerのViewは上下の領域に分かれている * 下の領域にUIPageViewControllerが配置され、その内側にUIViewControllerがある * 内側のViewControllerはUITableViewとUITextViewからなり、UITextViewで入力してコメントを投稿するとUITableViewに反映される * UITextViewを入力する時に、UIPageViewControllerの領域が上に広がり、画面いっぱいを覆い尽くすようになる * UITextViewの上にあるUITableViewをタップしたらキーボードを閉じたい(resignFirstResponderを呼び出し) ![![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/29c6ea1d414a0094044554ec41fff914.png)] ここで問題になるのが、「**UITableViewをタップしても、UITextViewが閉じてくれない時がある**」ということです。 (なぜか確率的に半々くらいです) 具体的にどのようにおかしな挙動になるのかを調べたところ、UITextViewが引っ込んでくれないときは、UITableViewではないところをタップしてもタップ判定になり、UITextFieldのresignが効かなくなってしまいます。 おそらく原因としては、UIPageViewControllerの領域を後から広げていることで、領域を変えずに実行してみると、しっかりUITextViewが引っ込んでくれるのは確認しています。 ちなみにUIPageViewControllerの領域の広げ方は、上の余白を縮めることで画面いっぱいに表示させていますが、それがよくない動作なのかもしれません。 ただこのような動作をしているアプリは既に存在するので、何かしらの方法で実現できるとは思うのですが、どこが悪いのか、またどのようにすれば改善するのか教えて頂けますと幸いです。 よろしくお願いします。
回答: 状況が完全には把握できておりませんが、閉じないときに、`resignFirstResponder`が呼ばれているのに閉じないのか、実は呼ばれていないのかを、まずは確認された方が良いと思います。 呼ばれているのに閉じないということであれば、`UITextView`以外のものがFirstResponderになっていて、それがキーボードを出している、もしくは、`UITextView`の形が変わっていて、`UITextView`がタップされているという可能性も疑った方が良いと思います。 実は呼ばれていないのケースでは、呼ぶためのコードを、増やす必要があると思います。 例えば、`UIPageViewController`の内側の`ViewController`の`view`に、`UITapGestureRecognizer`を追加して、`UITableView`の外側のタップを拾って、`resignFirstResponder`を呼ぶようにしてみるとかで解決出来るかもしれません。