group and plain style
iOS的tableView有两种样式:一种是plain(默认);一种是grouped。iOS系统的设置的样式就是grouped样式。这两种样式上是有很大差别的。我们用一张表格来对比下
sectionHeader/Footer | plain | grouped | 备注 |
---|---|---|---|
是否悬浮 | 悬浮 | 不悬浮 | - |
高度 | 默认为0 | 默认有一定的高度 | 如果不实现viewForHeaderInSection/viewForFooterInSection,header/footer背景色同tableView的颜色 |
分割线 | 默认无分割线 | 默认有分割线 | 可以通过把separatorStyle设置为UITableViewCellSeparatorStyleNone来取消header/footer的分割线 |
注意:
- 如果为grouped style,我们要隐藏某个section header/footer,将heightForHeaderInSection/heightForFooterInSection里的实现返回值设置成0是无效的,设置成0等同于默认设置,而它的默认设置是有一定高度的,如果我们要隐藏特定的section header/footer可以用直接返回
CGFLOAT_MIN
2.viewForHeaderInSection/viewForFooterInSection方法里不要自行创建header/footer view。虽然我们在这两个代理方法里创建的section header/footer,会被系统回收,但是频繁的创建和销毁对象对系统也有一定的开销,影响滑动体验。所以建议用将header,footer用forHeaderFooterViewReuseIdentifier
注册到tableView中,然后依据identifier重用。注意这时的header/footer需要继承UITableViewHeaderFooterView
3.另外,iOS8以后tableView会默认设置estimatedSectionFooterHeight
、estimatedSectionHeaderHeight
、estimatedRowHeight
。其实这个设置是为了在我们进行动态改变高度时默认的一个高度设置,在实际应用中我们可以不用对它们进行设置,如果你对这三个属性进行了设置,那么在iOS11上会出现一些问题,比如在动态计算高度的情景下,重新reload会出现tableView跳动的情况;heightForHeaderInSection/heightForFooterInSection代理方法没有调用的情况。这种情况下,直接将以上属性值设置为0即可。