关于UITableView Grouped模式下头部尾部空白及相关问题

个人而言在日常开发中,plain模式下的UITableView使用频率相对较高些。但由于UITableView的plain模式时,headerView会发生悬停,虽然使用UIScroViewDelegate的方法可以实现plain模式下不悬停。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat sectionHeaderHeight = 40;
    if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
        scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
    } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
        scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
    }
}

当需要headerView跟随着UITableView一起移动时,最简单直接的方式还是使用grouped模式。
一段时间不用grouped模式,再用时还是踩了几个坑,这里记录一下:
1. grouped模式下UITableView头部和尾部默认就有空白,去除空白的方法:
table.tableHeaderView = UIView.init(frame: CGRect(x: 0, y: 0, width: width, height: 0.01))
table.tableFooterView = UIView.init(frame: CGRect(x: 0, y: 0, width: width, height: 0.01))
注意这里的高度可以接近于0,但不能等于0,等于0时无效

这里其实是一个被 UITableView 默认填充的 HeaderView。而且,当试图将它的高度设置为 0 时,完全不起效果。但我们用下面的代码创建一个高度特别小的 HeaderView 时,上面的边距就不见了。
刨根问底 UITableViewHeader 的猫腻:
为什么刚才说 0.1 和 CGFLOAT_MIN 是等效的呢?经过研究,这个高度值的影响大概是这样的:
若传入的 height == 0,则 height 被设置成默认值
若 height 小于屏幕半像素对应的高度,这个 header 不在另一个像素渲染
半像素也就是 1.0 / scale / 2.0,如在 @2x 屏上是 0.25
http://blog.sunnyxx.com/2015/04/15/ios-hide-grouped-tableview-header/

2. grouped模式下UITableView heightForFooterInSection/heightForHeaderInSection 设置footer/header高度无效,解决方案

简单粗暴的方法:

table.sectionHeaderHeight = 0
table.sectionFooterHeight = 8

或者通过代理的方法,注意只设置heightForFooterInSection/heightForHeaderInSection是无效的,还要实现viewForFooterInSection/viewForHeaderInSection方法

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 8
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0.001
    }
    
    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        return UIView()
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return UIView()
    }

你可能感兴趣的:(关于UITableView Grouped模式下头部尾部空白及相关问题)