酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

(未解決)UINavigationBarで大きなタイトルを使っている時にスクロールさせると稀に画面タッチができなくなる問題

iOS 11から大きなタイトルが使えるようになりました。

UINavigationBarの大きなタイトルを使っている時に、UITableViewをスクロールさせると稀に画面タッチができなくなる問題が発生しています。発生確率はかなり低くて何が原因で発生するのかがわかっていません。

アプリとしてはUITableViewを下方面にフリックさせて更新するスタンダードなものです。イメージとしてはこんな感じ*1

f:id:ch3cooh393:20180306174125g:plain

問題の現象としては、UINavigationBarのlargeTitleを使ってる時にスクロールを頻繁にしてるとナビバーのフチの部分(ナビバーのshadow部分)がビロビロビローと震えてアニメーションが終わりません。びろびろーって震えている最中は、TableViewにタップできなくなる現象です。

解決方法を思いついたら追記します。

推測される現象

TableViewを下方向に引っ張ってスクロールさせて指を話すとバウンスして、ナビゲーションバーは元のサイズに戻ります。

この時に、RefreshControlと組み合わせていると、元のサイズに戻るアニメーションが収束せずに、TableViewのセルのタッチ操作が効かなくなる?

セルのタップはできなくてもTableViewのスクロールはできます。また他のタブに切り替えて元に戻せばタッチできるようです。

問題点

何が原因で発生しているのかわからないので試した方法を以下に書いていきます。

UIRefreshControlの設定の仕方が古い方法のままだった

UIRefreshControlの設定の仕方が古い方法のままだったので一部コードを修正しました。

refreshControl = UIRefreshControl()
if let ctrl = refreshControl {
  ctrl.addTarget(self, action: #selector(reloadAction(_:)), for: .valueChanged)
//            tableView.addSubview(ctrl)
  tableView.refreshControl = ctrl
}

tableView.addSubview(refreshControl)ではナビゲーションバーの下側にぐるぐるがひょうじされますが、tableView.refreshControl = refreshControlではナビゲーションバーのタイトルの上側に表示されます。

環境

  • iOS 11.2
  • 実機
  • シミュレータ(iPhone 5s、8)

*1:発生しているアプリとは異なります