1,出現(xiàn)該問題的原因:
這個(gè)應(yīng)該是UITableView最大的改變。我們知道在iOS8引入Self-Sizing之后,我們可以通過實(shí)現(xiàn)estimatedRowHeight相關(guān)的屬性來(lái)展示動(dòng)態(tài)的內(nèi)容,實(shí)現(xiàn)了estimatedRowHeight屬性后,得到的初始contenSize是個(gè)估算值,是通過estimatedRowHeight乘以 cell的個(gè)數(shù)得到的,并不是最終的contenSize,只是當(dāng)前屏幕能夠顯示的cell個(gè)數(shù),滑動(dòng)時(shí),tableView不停地得到新的cell,更新自己的contenSize。
Self-Sizing在iOS11下是默認(rèn)開啟的,Headers, footers, and cells都默認(rèn)開啟Self-Sizing,所有estimated高度默認(rèn)值從iOS11之前的 0改變?yōu)閁ITableViewAutomaticDimension:
如果目前項(xiàng)目中沒有使用estimateRowHeight屬性,在iOS11的環(huán)境下就要注意了,因?yàn)殚_啟Self-Sizing之后,tableView是使用estimateRowHeight屬性的,這樣就會(huì)造成contentSize和contentOffset值的變化,如果是有動(dòng)畫是觀察這兩個(gè)屬性的變化進(jìn)行的,就會(huì)造成動(dòng)畫的異常,因?yàn)樵诠浪阈懈邫C(jī)制下,contentSize的值是一點(diǎn)點(diǎn)地變化更新的,所有cell顯示完后才是最終的contentSize值。因?yàn)椴粫?huì)緩存正確的行高,tableView reloadData的時(shí)候,會(huì)重新計(jì)算contentSize,就有可能會(huì)引起contentOffset的變化。
2,解決方案:關(guān)閉默認(rèn)開啟的選項(xiàng)
if (@available(iOS 11.0, *)) {
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;
_tableView.estimatedSectionHeaderHeight=0 _tableView.contentInsetAdjustmentBehavior= UIScrollViewContentInsetAdjustmentNever;
}
原文:https://blog.csdn.net/u012498386/article/details/79552820