點擊sectionHeader頭部下拉展示列表內容,點擊收起,類似QQ、微信的好友列表。
QQ好友列表.jpeg
在項目也有這種類似的展示點擊頭部sectionHeader 來展示數據的方式,做法很簡單,利用一個屬性來標志section是否展開(opend),利用
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
來刷新section。我的demo中比較簡單,就是一個section中一個cell,所以展開的section中cell數量為1(同理,可以拓展為多個cell)。
在 iOS11之前展示正常,最近項目在適配iOS11,發現了在這個tableView中關于點擊sectionHeader頭部時候,會出現sectionHeader 重疊的現象。原本為了適配關于tableView的在iOS 11中默認啟用Self-Sizing,在每原本代碼基礎上,初始化返回一個footerView和headerView,在其他的頁面沒出現問題。
//ios 11
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
return [[UIView alloc] init];
}
但在這里需要用戶手動更新section的時候,這樣就會造成contentSize和contentOffset值的變化,如果是有動畫是觀察這兩個屬性的變化進行的,就會造成動畫的異常,因為在估算行高機制下,contentSize的值是一點點地變化更新的,所有cell顯示完后才是最終的contentSize值。因為不會緩存正確的行高,tableView reloadData的時候,會重新計算contentSize,就有可能會引起contentOffset的變化。
重疊.jpeg
所以為了維護原本的效果,這里采取的是關閉Self - Sizing
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
正常.jpeg