iOS开发之有间距的UITableViewCell

作者: YungFan | 来源:发表于2016-07-22 07:55 被阅读9466次

UITableView是最常用的一个iOS控件,现要做一个如下图的UITableView,其中白色部分就是cell,可是默认的UITableView中cell之间是没有间隔的,那么办呢?网上有2种做法,我这里顺带提一下吧

效果图.png

1、方式一
通过设置cell的contentView来间接实现,在cell的contentView的顶部或者底部留下一定的间距,这样就会有cell间就有间距的效果。但是这种方式在cell有点击效果的时候,会很明显的看出有分层,因为这时候cell是被点击的,contentView都会有系统点击的阴影效果。这种方式在cell左滑删除,置顶等操作的时候,左滑出的视图会高出一部分(左滑显示出的高度=(cell的高度-留下的间距高度)+ 留下的间距高度),很显然这种方式有致命缺陷。

2、方式二
通过分组的方式间接的实现,每组的Header可以当做是cell之间的间距,每组中只有一个cell,代码如下:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ return 10;}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 { return 10;}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 { return 1;}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
 { return 100;}

但是呢,这还是会出现一个问题,因为系统默认分组的时候每组的Header会停留在tableview的顶部,这要怎么处理呢?网上也有一种解决办法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {    
if (scrollView == self.tableView)    {        
CGFloat sectionHeaderHeight = 10;    
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);        
       }   
   }
}

但是这种方式是通过scroll偏移量来监听和改变tableview的contentInset。

补充:上面的代码只能设置headerView,如果想footerView也没有粘性,怎么办?看到国外一位大神写的如下代码

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.tableView)
        {
        UITableView *tableview = (UITableView *)scrollView;
        CGFloat sectionHeaderHeight = 64;
        CGFloat sectionFooterHeight = 120;
        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);
        }
    }
}

优雅的方式
其实优雅的也是最简单的方法是直接让UITableView中的cell收缩一点,这样UITableView的底色就是分割线的颜色了,如上图就是橘色。这种方式只需要重写cell的setFrame方法即可

-(void)setFrame:(CGRect)frame
{
    frame.origin.x = 10;//这里间距为10,可以根据自己的情况调整
    frame.size.width -= 2 * frame.origin.x;
    frame.size.height -= 2 * frame.origin.x;
    [super setFrame:frame];   
}

如果此时想要实现圆角也很简单,直接加上

self.layer.masksToBounds = YES;
self.layer.cornerRadius = 8.0;

此时效果图:

圆角矩形cell.png

PS:这种方式不适合有编辑的情况,因为在编辑的时候会不停调用setFrame方法,导致错乱,此时建议使用上面的第二种方案。感谢简友的提醒,之前做的是无编辑的情况,有编辑的没有测试。

相关文章

网友评论

  • iCode_:费那劲干啥,一个collectionview就解决了!傻小子睡凉炕,全凭火力壮啊这是:sweat_smile:
    YungFan:@淡漠烟薰 :smile: 高手来了
  • Z了个Y:setframe会与自适应高度cell起冲突,导致cell高度算不准,不知道楼主是否遇到过这种情况
    YungFan:@Z了个Y 尚未遇到 如果有冲突是因为setFrame 建议换其他方案
  • LD_左岸:如果既想给cell添加裁剪圆角 又想添加阴影 怎么搞
  • 洁简:最后一种设置后是不是就改变了cell的高度
    YungFan:@洁简 是的
  • Saylor_Lone:-(void)setFrame:(CGRect)frame
    {
    frame.origin.x = 10;//这里间距为10,可以根据自己的情况调整
    frame.size.width -= 2 * frame.origin.x; //---------------|
    frame.size.height -= 2 * frame.origin.x;//---------------| 这种写法,会在横向和纵向上无穷缩小,编辑状态 侧滑时可见。建议直接赋值
    [super setFrame:frame];
    }
    YungFan:@Saylor_JMS :+1: 编辑模式的时候不建议用这个方法
  • 阡陌流年:这种做法会导致整个cell y方向缩小啊,会有东西被挤压,这怎么解决?
    YungFan:@阡陌流年 调整一下Cell的布局就可以了啊
  • 时间不会倒着走:为何我用setFrame不起作用,设置origin.x起作用,width和height都不起作用
    时间不会倒着走:@时间不会倒着走 哦哦,已解决,看错了,谢谢楼主
    YungFan:@时间不会倒着走 不会啊 我都有效果的
  • fceb06111410:早先我也用setFrame的方法,直到编辑的时候,动画教你做人……
    另外这种设置圆角还是存在性能问题。
    我个人的解决方法,圆角用绘制的方式,配合背景色的绘制,同样左右的空白也是绘制解决。cell之间的空白可以用绘制,也可以用空白的cell来解决。需要更新绘制内容的时候设置setNeedsDisplay就可以了。
    fceb06111410:@YungFan 绘制仅在初始化的时候绘制一次,没有离屏渲染,不会有圆角的性能问题。亲测性能优于直接设置圆角,基本都是60帧。
    timelove:@厨子被抢注 想问下 你是怎么解决的吗 绘制怎样 做 我就是碰到用setFrame左滑。。。错乱了
    YungFan:@厨子被抢注 方法有很多,你说的绘制我不是很理解,绘制不耗性能?
  • 90后的晨仔:你好,我想问一下那如果就是这中布局然后在加一个侧滑功能,应该怎么实现?
    YungFan:@1848倒计时这种不适合
  • ducks:xib 画 自动计算高度有问题 当label 的行只有一行的时候 算的高度不准
  • 鱼鱼鱼四只鱼:不是很懂第二种方法里面大神的那段代码
  • seky: :joy: 以前是在cell里面画线做的
    YungFan:@seky 那种最基本 但做不了这种效果
  • ocarol:这三种我都用过 :smile:
    YungFan:@ocarol 🐂B啊 你觉得哪种好?
  • zero_zql:设置类型为group可以解决,header停靠问题
    YungFan:@zero_zql 停靠问题 文中也有代码可以解决 这也是网上的方案
  • 帶頭二哥:这样做是有问题的,如果有侧滑删除cell的功能整个界面会乱
    YungFan:@帶頭二哥 如果要编辑 建议使用网上说的第二种方案
  • 小峰书:右滑删除越滑越小,用的swift,不能用在cell的编辑
    YungFan:@小峰书 编辑是可以的 但是会出现错乱 如果cell需要编辑 建议使用网上说的第二种方案
  • KevinZhan:nice 只是对于形态行高的cell,可能要对生成的行高进行处理~固定行高的还是很赞,mark了
    YungFan:@KevinZhan 是的
  • 0x00chen:收藏,以后用
  • xxttw:不错 先收藏
  • 黑白羽森林:还可以通过row的奇偶性 创建不同的cell
    YungFan:@梦镜 这当然 不同类型的都可以

本文标题:iOS开发之有间距的UITableViewCell

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