• 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/

  • 相关阅读:
    YII框架实现排序
    YII2 实现登录时候修改最新登录时间
    YII框架下实现密码修改
    json在PHP中应用技巧
    更换Python pip库镜像地址
    Python3创建RIDE桌面快捷方式的另一种方法
    谈谈测试人员的基本素养
    《微软的软件测试之道》阅读笔记
    PPT如何一页多张打印且铺满整个页面
    Linux 在线模拟器
  • 原文地址:https://www.cnblogs.com/Jenaral/p/5627789.html
Copyright © 2020-2023  润新知