美文网首页
关于UITableView Grouped模式下头部尾部空白及相

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

作者: 小呀小苹果呀 | 来源:发表于2019-10-11 18:14 被阅读0次

    个人而言在日常开发中,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模式下头部尾部空白及相

          本文链接:https://www.haomeiwen.com/subject/dsjxmctx.html