iOS 11 UItableViewで遭遇したピット

1914 ワード

質問:iOS 11でUItableviewは最後の行のバグにスライドできません.
最近、プロジェクトはインスタント通信を行うIMのappで、プロジェクトの中で1つの問題に出会って、iPhoneシステムをios 10からios 11にアップグレードした後、uitableviewコントロールを使う時1つのとても奇妙な問題に出会って、毎回新しいニュースを受信する時、uitableviewは最新のメッセージ行、つまり最後の行にスライドします.ios 11の前には何の問題もなく、ios 11の上に問題が発生し、最後の行にスライドできません.いろいろな原因を探して、最初はuitableviewcellの計算の高さが間違っていると思っていたが、contentSizeの問題を疑って、ついに犯人を見つけた.そうです.contentSizeの計算が間違っています.
Table Views:iOS 11でSelf-Sizingがデフォルトで有効
これはUItableViewの最大の変更であるはずです.iOS 8がSelf-Sizingを導入した後、estimatedRowHeight関連の属性を実現することによって動的な内容を示すことができ、estimatedRowHeight属性を実現した後、得られた初期contenSizeは推定値であり、estimatedRowHeightxcellの個数によって得られ、最終的なcontenSizeではなく、tableViewはすべてのcellの高さを一度に計算することはできないことを知っています.現在の画面に表示できるcellの個数に数を加えて、スライドすると、tableViewが新しいcellを取得し続け、自分のcontenSizeを更新し、最後までスライドすると、正しいcontenSizeが得られます.Self-SizingiOS 11ではデフォルトオープン、Headers,footers,and cellsではデフォルトオープンSelf-Sizingであり、すべてのestimated高さデフォルト値はiOS 11より前の0からUITableViewAutomaticDimensionに変更された.
@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0);//default is UITableViewAutomaticDimension, set to 0 to disable
現在のプロジェクトでestimateRowHeightプロパティが使用されていない場合は、iOS 11の環境で注意してください.Self-Sizingをオンにした後、tableViewはestimateRowHeightプロパティを使用するため、contentSizeとcontentOffset値の変化をもたらします.アニメーションがこの2つのプロパティの変化を観察している場合、アニメーションの異常をもたらします.推定行高メカニズムの下で、contentSizeの値は少しずつ変化して更新され、すべてのcellが表示された後に最終的なcontentSizeの値になります.行の高さが正しくキャッシュされないため、tableView reloadDataの場合、contentSizeが再計算され、contentOffsetが変化する可能性があります.iOS 11でSelf-Sizingを使いたくない場合は、以下の方法で閉じることができます.
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

参考記事:iOS 11にアプリを合わせる必要があるかもしれません