点击sectionHeader头部下拉展示列表内容,点击收起,类似QQ、微信的好友列表。
在项目也有这种类似的展示点击头部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的变化。
所以为了维护原本的效果,这里采取的是关闭Self - Sizing
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;