UITableView使用中的一些刁专问题总结

    1. tableview中cell的系统分隔线问题(分隔线顶满或者缩短)

      //tableview代理方法,设置系统cell的分隔线
      -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
      {
          if (0 == indexPath.section) {
              if (0 == indexPath.row) {
                  //cell分隔线缩短50
                  if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
                      [cell setSeparatorInset:UIEdgeInsetsMake(0, 50, 0, 0)];
                  }
              }else {
                  //cell分割线顶满(分隔线加长)
                  if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
                      [cell setSeparatorInset:UIEdgeInsetsZero];
                  }
                  if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
                      [cell setLayoutMargins:UIEdgeInsetsZero];
                  }
              }
          }else if (1 == indexPath.section) {
              if (0 == indexPath.row) {
                  if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
                      [cell setSeparatorInset:UIEdgeInsetsZero];
                  }
                  if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
                      [cell setLayoutMargins:UIEdgeInsetsZero];
                  }
              }
          }else if (2 == indexPath.section){
              if (0 == indexPath.row) {
                  if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
                      [cell setSeparatorInset:UIEdgeInsetsMake(0, 50, 0, 0)];
                  }
              }
          }
      }
      
    2. tableview下面出现多余的cell(有分割线影响界面)

      //隐藏多余cell
      -(void)setExtraCellLineHidden: (UITableView *)tableView
      {
          UIView *view = [UIView new];
          view.backgroundColor = [UIColor clearColor];
          [tableView setTableFooterView:view];
      }
      

      例如:
      你要隐藏某个UITableView里面多余的cell
      UITableView *tabelDemo = [[UITableView alloc] init];
      [self.view addSubview:tabelDemo];
      然后直接调用就可以了
      [self setExtraCellLineHidden:tabelDemo];

    3. tableview顶部空出的一部分高度(原因我猜有可能是因为系统自动布局计算了状态栏的高度)

      //去掉tableview顶部高度多出的一部分
      self.edgesForExtendedLayout = UIRectEdgeNone;(这里self指当前控制器,只需要在viewDidl
      Load调用)

    4. swift版本:

          func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

       

              cell.separatorInset = UIEdgeInsetsZero

              cell.layoutMargins = UIEdgeInsetsZero

          }  

    5. iOS 7开始UITableView的分割线不在从左侧边界开始了,而是默认空出了一段距离。

      如果想要使用默认的分割线而且还要从左侧边界开始的话,有几种解决方式:

      1、在tableView的代理方法中设置

      [objc] view plain copy
       
       在CODE上查看代码片派生到我的代码片
      1. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath  
      2. {  
      3.       
      4.     if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {  
      5.         [cell setSeparatorInset:UIEdgeInsetsZero];  
      6.     }  
      7.       
      8.     if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {  
      9.         [cell setLayoutMargins:UIEdgeInsetsZero];  
      10.     }  
      11.       
      12.     if([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]){  
      13.         [cell setPreservesSuperviewLayoutMargins:NO];  
      14.     }  
      15. }  

      2、既设置tableView代理,又设置tableView属性

      首先在初始化tableView的时候,加上如下这两句:

      [objc] view plain copy
       
       在CODE上查看代码片派生到我的代码片
      1. if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {  
      2.     [_tableView setSeparatorInset:UIEdgeInsetsZero];  
      3. }  
      4. if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {  
      5.     [_tableView setLayoutMargins:UIEdgeInsetsZero];  
      6. }  
      然后在代理方法中这样设置:
      [objc] view plain copy
       
       在CODE上查看代码片派生到我的代码片
      1. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath  
      2. {  
      3.       
      4.     if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {  
      5.         [cell setSeparatorInset:UIEdgeInsetsZero];  
      6.     }  
      7.       
      8.     if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {  
      9.         [cell setLayoutMargins:UIEdgeInsetsZero];  
      10.     }  
      11. }  
      上面这种做法也是可以的。

      2、重写分割线

      UITableView的分割线也是用UIView做的,具体可以看UITableView的层次结构,可以发现它其实是UITableViewCellSeparatorView,是cell的一个子视图。

      [objc] view plain copy
       
       在CODE上查看代码片派生到我的代码片
      1. <_UITableViewCellSeparatorView: 0x7f9f5a64cf80; frame = (59.5; 200.5); layer = <CALayer: 0x7f9f5a627a80>>  

      这是我打印的demo中一个小tableView中的系统默认分割线的信息,猜测是UIView的某个子类,所以我们自定义一个UIView高度设置为0.5,添加到cell上即可。

       
       

参考链接:

1.http://blog.csdn.net/u011619283/article/details/51219811

2.http://jinqianchina.github.io/2016/03/22/UITableView%E4%BD%BF%E7%94%A8%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E5%88%81%E4%B8%93%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/

原文地址:https://www.cnblogs.com/Jenaral/p/5627789.html