iOS 关于tableView的总结

0.性能优化

测试帧数(注意:使用真机)
xcode - produce - profile - core animation - 红色按钮

1.行高一定要缓存
2.不要动态创建子视图
      所有的子视图都预先创建
      如果不需要显示就hidden
3.所有的子视图都添加到contentView上,不然处理左滑按钮事件,比如删除等可能会出现问题
4.所有的子视图都必须设置背景色
5.所有的颜色都不要使用alpha
6.cell栅格化(将cell中的所有内容,生成一张独立的图像)
    //在屏幕滚动时,只显示图像
    cell.layer.shouldRasterize = YES;
    //栅格化,必须指定分辨率,否则默认使用 * 1,生成图像!
    cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
7.异步绘制
    cell.layer.drawsAsynchronously = YES;

1.不需要添加额外的滚动区域

    self.automaticallyAdjustsScrollViewInsets = NO;

2.动态修改tableHeaderView的高度,重新设置过那个view的frame,再tableHeaderView一次

    [self.tableView beginUpdates];
    self.tableView.tableHeaderView = [[UIView alloc] init];// 关键是这句话
    [self.tableView endUpdates];

3.得出第3个cell的位置

    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:2 inSection:0];
    //得出第3个cell的位置
    CGRect  popoverRect = [self.tableView convertRect:[self.tableView rectForRowAtIndexPath:indexPath] toView:[self.tableView superview]];

.4. 这个能够避免cell点击和UITableView的点击事件的冲突
注意:给cell添加手势,在手势的范围区域里,它会处理手势,而不是cell的点击事件,在范围外它会处理cell的点击事件

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    
    // 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
    if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
        return NO;
    }else
    {
        return YES;
    }
}

5.常用属性

       //1.分隔线
        _tableView.separatorColor = [UIColor redColor];
        _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        
//        当tableview的类型为 plain的时候,header View 就会停留在最上面。
//        
//        当类型为 group的时候,header view 就会跟随tableview 一起滚动了。

        //关于头部,尾部控件
        //2.这样可以去掉多余的分隔线
        _tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
        
        //3.高度
        _tableView.rowHeight = 10;
        //(每组的尾部高度)
        _tableView.sectionFooterHeight = 19;
        _tableView.sectionHeaderHeight = 10;

        //4.允许被选中
        _tableView.allowsSelection = YES;

        //5.编辑状态
        _tableView.editing = YES;
        
       //6. Tableview一直显示滚动条
         [self.tableView flashScrollIndicators];
        
        //7.设置UITableView的滚动条颜色
        self.tableView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
        
       //8. 要让tableView在编辑状态下能处理点击事件必须设置这个属性allowsSelectionDuringEditing!!!
        _tableView.allowsSelectionDuringEditing = YES;
        
        //9.更改索引的背景色
        _tableView.sectionIndexBackgroundColor = [UIColor clearColor];
        //10.更改索引的文字颜色
        _tableView.sectionIndexColor = [UIColor redColor];

       //11.滚动条滚动范围
        _tableView.scrollIndicatorInsets = _tableView.contentInset;

6.这是遍历所有的indexPath

    for (NSIndexPath * index in tableView.indexPathsForVisibleRows)
    {
        tableView.indexPathsForSelectedRows   //所有选中的行数
        tableView.indexPathForSelectedRow     //单个选中的行数
    }

7.索引点击事件

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:index] atScrollPosition:UITableViewScrollPositionTop animated:YES];
    return index;
}

8.判断向上滑动还是向下滑动

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    //先定义一个oldOffset为tableView的初始位置
    
    if (scrollView.contentOffset.y > self.oldOffset) {//如果当前位移大于缓存位移,说明scrollView向上滑动


    }else

    
    self.oldOffset = scrollView.contentOffset.y;//将当前位移变成缓存位移
    
}

9.去掉UItableview headerview黏性(sticky)

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == _tableView) {
        //这是每组头部的高度
        CGFloat sectionHeaderHeight = 36;
        
        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);
        }
    }
}

10.去掉UItableview headerview Footer 黏性(sticky)

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView == self.tableView)
    {
        UITableView *tableview = (UITableView *)scrollView;
       //这50是每组头部尾部的高度
        CGFloat sectionHeaderHeight = 50;
        CGFloat sectionFooterHeight = 50;
        CGFloat offsetY = tableview.contentOffset.y;
        if (offsetY >= 0 && offsetY <= sectionHeaderHeight)
        {
            tableview.contentInset = UIEdgeInsetsMake(-offsetY, 0, -sectionFooterHeight, 0);
        }else if (offsetY >= sectionHeaderHeight && offsetY <= tableview.contentSize.height - tableview.frame.size.height - sectionFooterHeight)
        {
            tableview.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, -sectionFooterHeight, 0);
        }else if (offsetY >= tableview.contentSize.height - tableview.frame.size.height - sectionFooterHeight && offsetY <= tableview.contentSize.height - tableview.frame.size.height)
        {
            tableview.contentInset = UIEdgeInsetsMake(-offsetY, 0, -(tableview.contentSize.height - tableview.frame.size.height - sectionFooterHeight), 0);
        }
    }
}

11.根据cell的子控件,得到对应的NSIndexPath

//获取到对应的NSIndexPath,textField为cell的子控件
    CGPoint point = [self.textField.superview convertPoint:self.textField.frame.origin toView:self.tableView];
    NSIndexPath *index = [self.tableView indexPathForRowAtPoint:point];

12.判断控件是不是cell的子控件

if ([[[textField.superview class] description] rangeOfString:@"UITableViewCellContentView"].location != NSNotFound)

13.滚动到tableview的底部

第一种
[self.tableView setContentOffset:CGPointMake(0 , 50 * (array.count + 2) - (ScreenHeight - NavBarHeight)) animated:YES];
第二种
[self.tableView scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionBottom animated:YES];
第三种
if (self.tableView.contentSize.height <= self.tableView.frame.size.height) {
        self.tableView.contentOffset = CGPointMake(0, 0);
    } else {
        self.tableView.contentOffset = CGPointMake(0, self.tableView.contentSize.height - self.tableView.frame.size.height);
    }

14.给cell添加悬浮效果(在自定义cell的时候在cell上面添加view)

//创建一个UIView比cell.contentView小一圈
    UIView *view  = [[UIView alloc] initWithFrame:CGRectMake(10, 5, [UIScreen mainScreen].bounds.size.width - 20, 90)];//这里cell的高度为100
    view.backgroundColor = [UIColor whiteColor];
    
    //给view边框设置阴影
    view.layer.shadowOffset = CGSizeMake(1,1);
    view.layer.shadowOpacity = 0.3;
    view.layer.shadowColor = [UIColor lightGrayColor].CGColor;
    [cell.contentView addSubview:view];

15.给cell左右上镂空(悬浮效果)

1.给cell.contentView的添加UIImageView,设置UIImageView的image,highlightedImage为了让有同样的点击效果highlightedImage 的图片颜色为 [UIColor colorWithWhite:0.85 alpha:1.0]

2.子控件添加到UIImageView上

3.设置cell的selectedBackgroundView,backgroundColor和cell.contentView.backgroundColor为tableview的背景色即可

//第二种方式,算高度的时候还是要把那20加上
- (void)setFrame:(CGRect)frame
{
    CGRect rect = frame;
    
    rect.origin.x += 15;
    rect.size.width -= 30;
    rect.origin.y += 20;
    rect.size.height -= 20;
    frame = rect;
    [super setFrame:frame];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容