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を導入した後、
@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0);//default is UITableViewAutomaticDimension, set to 0 to disable
現在のプロジェクトでestimateRowHeightプロパティが使用されていない場合は、iOS 11の環境で注意してください.
参考記事:iOS 11にアプリを合わせる必要があるかもしれません
最近、プロジェクトはインスタント通信を行う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
は推定値であり、estimatedRowHeight
xcell
の個数によって得られ、最終的なcontenSize
ではなく、tableView
はすべてのcellの高さを一度に計算することはできないことを知っています.現在の画面に表示できるcellの個数に数を加えて、スライドすると、tableView
が新しいcellを取得し続け、自分のcontenSize
を更新し、最後までスライドすると、正しいcontenSize
が得られます.Self-Sizing
iOS 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にアプリを合わせる必要があるかもしれません