anz blog

IQKeyboardManagerでPrev/Nextボタンが表示されない場合の対処方法

2019-05-27 #Swift

ざっくりまとめ。

  • IQKeyboardManager を使用していてもキーボード表示時に Prev/Next ボタンが表示されないケースがある。
    • ネストが深いView構造をしていると発生するっぽい?
  • その場合は、対象のTextFieldの共通の親Viewになるものを IQPreviousNextView にする

です。

IQKeyboardManager とは

キーボード周りをよしなに調整してくれるやつで、
キーボード表示したときに対象の TextField なんかが見えるようにスクロールしてくれたり、
キーボードにツールバーを追加表示させて、完了ボタンやフォーカス移動をしてくれるボタンを設置してくれたりします。
今回はそのフォーカス移動をしてくれるボタンの話です。

環境

  • Xcode v10.2.1
  • IQKeyboardManager v6.3.0

問題

UIScrollView + UIStackView という構造にして画面を組んでいた時に発生したのですが、
IQKeyboardManager を有効にしているにもかかわらず、キーボードに付属して表示されるツールバーに Prev/Next ボタンが表示されないという問題が。

Prev/Nextが出ない

UIScrollView + UIStackView だと必ず発生するというわけでもなくて、UIStackView 内の View のネストが深い場合にどうやら発生するみたいでした。

UIView
  └ UIScrollView
      └ UIStackView
          ├ UIView
          │   └ UITextField
          ├ UIView
          │   └ UITextField
          └ UIView
              └ UITextField

こういう構造です。
ちなみに、UIStackView に直接 UITextField を入れていくと期待している挙動になるので、ネストが深くなってくると発生するのだろうと思います。

対策

対策は割と簡単で、IQKeyboardManager で管理したい(Prev/Nextで扱いたい)すべての UITextField の共通の親View(直接の親ではなくても)になるものを IQPreviousNextView にする。
言い換えると、管理したい UITextField はすべて IQPreviousNextView 配下のView内にするということです。

UIView
  └ IQPreviousNextView <- 追加
      └ UIScrollView
          └ UIStackView
              ├ UIView
              │   └ UITextField
              ├ UIView
              │   └ UITextField
              └ UIView
                  └ UITextField

こういう感じにViewのツリー構造をかえると...

正常パターン

無事表示されるようになります!💪

参考