美文网首页iOSios UI与自定义控件111
iOS tableHeaderView的那些坑

iOS tableHeaderView的那些坑

作者: 七里田间的守望者 | 来源:发表于2017-04-12 10:28 被阅读12582次

    前言:

    tableView 有个属性叫tableHeaderView 用它我们可以做很多事情
    在tableView的头部加上自定义的view 随着tableView一起滚动

    常用的就是轮播图比如这样

    DAD90DE4-84E9-4194-9554-40956AD01E32.png

    tableView 的tableHeaderView 有两种创建方式一中是代码创建另外一种是用xib创建

    用代码创建

      UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.width, 200)];
        // 设置header
      self.tableView.tableHeaderView = header;
    
    • 因为 self.tableView.tableHeaderView的高度是没有办法设置的,所以必须设置自定义View的高度 来达到设置 self.tableView.tableHeaderView的高度

    用xib创建

    BBSTableHeaderView * cell = [BBSTableHeaderView tableHeaderView];
    cell = 291;
    self.tableView.tableHeaderView = header;
    
    • 按理来说这样设置肯定是没有问题的 但是这时候你设置的高度是不准确的 而且是没有办法适配机型的
    • 所以这样的设置发放不可行
    • 然后这里有个小tips 很简单 但是如果你想不到的话 你可能在这个高度问题上调试一整天 比如说我

    - 解决方案

        UIView * header = [[UIView alloc]init];
        header.backgroundColor = [UIColor whiteColor];
        BBSTableHeaderView * cell = [BBSTableHeaderView tableHeaderView];
        cell.backgroundColor = [UIColor clearColor];
        [header addSubview:cell];
        header.height = 291;
        self.tableView.tableHeaderView = header;
    
    • 原理 就是在xib View下面在加一层View (代码创建的) 这样才能保证你设置的高度是准确的 因为Xib高度 准确 必须再加一层代码创建的view才能保证你的View的高度是准确的 而且是适配各种机型的

    其他

    • tableView 的顶部会由于设置tableHeaderView而变得 有一片空白

    解决方案如下:

    //在控制器里面viewDidLoad 写下这句代码应该就可以了
    
    self.automaticallyAdjustsScrollViewInsets = NO;
    
    /*
    * 坐标:以屏幕左上角为原点(iOS7以前在状态栏或者导航条下)
    2.UIScrollView(包括其子类,比如UITableView):会自动在顶部和底部预留一些空白(因为滚动经过半透明导航条或者tabbar下面,需要能隐约看到的效果),是否预留空白可以由UIViewController的
    automaticallyAdjustsScrollViewInsets的这个属性控制(默认YES,表示预留空白)。
    上面这些只要你用iOS开发,就能发现。
    
    一个控制器中,出现UIScrollView(包括其子类),必须是第一个添加到控制器的视图上才会预留空白,这里的第一个是相对于所有的子视图,不仅仅是其他UIScrollView(包括其子类)。
     
    那么我遇到的问题如何解决呢,还是这个属性automaticallyAdjustsScrollViewInsets,仔细看它的文档说明,它说了,如果一个控制器中出现两个以上的UIScrollView(包括其子类),这个属性需要设置为NO.即不会预留空白,那么这个控制器中所有的UIScrollView(包括其子类)都需要重新设置坐标
    */
    
    • 有的时候上面这种方法设置是没有用的 所以如果上面这种方法没有用很有可能是创建tableView的时候用的分组样式,
      解决方法如下
      注意:不要写0 要写一个比较小的数字 别问为什么 因为设置0 没有效果
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
    {
        return 0.01;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.01;
    }
    
    • 如果你还有其他的需求比如怎么隐藏 self.tableView.tableHeaderView 或者比如怎么改变self.tableView.tableHeaderView的高度看下面
    //显示headerView
    [self.tableView.tableHeaderView setHidden:NO];
    
    //隐藏headerView
     [self.tableView.tableHeaderView setHidden:YES];
    
    //这样设置是没有用的 不信你可以试试 始终为0
    self.tableView.tableHeaderView.height = xxx;
    
    //应该这么设置
    UIView *tableHeaderView = _tableView.tableHeaderView;
    tableHeaderView.height = 0.01;
    [_tableView setTableHeaderView:tableHeaderView];
    //如果你要设置
    tableHeaderView.height = 0;//这样是没有效果的 而且tableView的顶部又会多处一片空白  一定要设置一个比较小的值 当然这个值并不是0;
    

    写在末尾

    以上内容是自己在开发中遇到过得问题 以及自己的解决方案 写在这里 是想让更多人知道这里的坑 以免在这个小问题上耽误大家的时间.
    最后如果这篇文章对你有用 请给我一个赞 作为鼓励 谢谢~

    相关文章

      网友评论

      本文标题:iOS tableHeaderView的那些坑

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