

Swift5でアプリを開発していますが、奇妙な事が発生しました。

アプリはUICollectionViewを使用してセルにキーボードやPickerViewでデータを入力するものです。セルにキーボードから入力される場合で、そのセルが隠れる場合は、View（全てのUICollectionViewを乗せています）全体を上部にキーボードサイズ分移動しています。（PickerViewはセルが隠れない大きさにしているのでViewの移動は無しです）

これに対し、機能強化のためdatePickerをstoryboardでViewの上に追加しました。  
そうしたら、最初に初期画面から移動してきた時は、以前と同様に正常な動作をするのですが、そこで、画面の更新をするとキーボード入力時にViewが直ぐに戻ってしまいセルが隠れてしまうようになってしまいました。下記の後に初期画面に戻り（`show`）、再度同じ操作をしても画面更新後と同じくViewが戻ってしまいます。

また、datePickerを追加してから発生していますが、datePickerを使用する画面を表示していない場合でもこの問題は発生します。これでは、datePickerを使用できません。どなたかこの原因や回避方法をご存知の方はいらっしゃいませんでしょうか？

下記がその動きです。左端の数字はログを取るために設定した各モジュールのIDです。ここでも気になる点があります。

  * なぜ、画面更新されるとキーボード入力開始(ID:20)が2回呼ばれるのか？
  * なぜキーボード表示された後にレイアウト変更(ID:4)が呼ばれるのか？

ここで、

  * `textFieldDidBeginEditing` と `textFieldDidEndEditing` はtextFieldのdelegateです。
  * textFieldはUICollectionViewのセルの中に設定されています。
  * `viewDidLoad` にて `NotificationCenter.default.addObserver` を使ってObserverに `showKeyboard`/`closeKeyboard` を設定しています。`scrollTableCell` はこれらのメソッドから呼び出されます。
  * `scrollTableCell` はViewを上げる時も下げる時も呼ばれます。（フラグにより判断）
  * datePickerについては `@IBOutlet` の変数定義だけです。

＜初期画面から `show` で移動＞

[code]

    0: viewDidLoad()
    1: viewWillAppear
    4: viewDidLayoutSubviews
    6: collectionView( insetForSectionAt section: Int) x 8
    4: viewDidLayoutSubviews
    20: textFieldDidBeginEditing
    6: collectionView( insetForSectionAt section: Int)
    7: showKeyboard(_ notification: Notification)
    10: scrollTableCell
    8: closeKeyboard
    10: scrollTableCell
    21: textFieldDidEndEditing
    6: collectionView( insetForSectionAt section: Int)
    30: collectionView(didSelectItemAt indexPath: IndexPath)
    
[/code]

＜画面の更新＞  
`self.loadView()` と `self.viewDidLoad()` が実行されています。

[code]

    0: viewDidLoad()
    4: viewDidLayoutSubviews
    6: collectionView( insetForSectionAt section: Int) x 8
    20: textFieldDidBeginEditing
    20: textFieldDidBeginEditing
    6: collectionView( insetForSectionAt section: Int)
    7: showKeyboard(_ notification: Notification)
    10: scrollTableCell
    7: showKeyboard(_ notification: Notification)
    10: scrollTableCell
    4: viewDidLayoutSubviews
    4: viewDidLayoutSubviews
    8: closeKeyboard
    10: scrollTableCell
    8: closeKeyboard
    10: scrollTableCell
    21: textFieldDidEndEditing
    
[/code]


CC BY-SA 4.0
2021-09-12T07:31:58.210
82439
2021-09-14T16:37:36.917
2021-09-14T16:37:36.917
7500
47542
question
ios storyboard swift5
datePickerを乗せたら、画面更新で、キーボードによるセル隠れ防止が異常動作