IQKeyboardManagerでPrev/Nextボタンが表示されない場合の対処方法
ざっくりまとめ。
- IQKeyboardManager を使用していてもキーボード表示時に Prev/Next ボタンが表示されないケースがある。
- ネストが深いView構造をしていると発生するっぽい?
- その場合は、対象のTextFieldの共通の親Viewになるものを
IQPreviousNextView
にする
です。
IQKeyboardManager とは
キーボード周りをよしなに調整してくれるやつで、
キーボード表示したときに対象の TextField なんかが見えるようにスクロールしてくれたり、
キーボードにツールバーを追加表示させて、完了ボタンやフォーカス移動をしてくれるボタンを設置してくれたりします。
今回はそのフォーカス移動をしてくれるボタンの話です。
環境
- Xcode v10.2.1
- IQKeyboardManager v6.3.0
問題
UIScrollView
+ UIStackView
という構造にして画面を組んでいた時に発生したのですが、
IQKeyboardManager
を有効にしているにもかかわらず、キーボードに付属して表示されるツールバーに 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のツリー構造をかえると...
無事表示されるようになります!💪