欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发之TableView实现完整的分割线详解

程序员文章站 2024-02-19 09:10:58
前言 在我们创建一个tableview的时候,细心的你有没有发现uitableviewcell左侧会有空白。而我们在开发中有这样的需求: 需要一根完整的分割线(去掉烦人的...

前言

在我们创建一个tableview的时候,细心的你有没有发现uitableviewcell左侧会有空白。而我们在开发中有这样的需求: 需要一根完整的分割线(去掉烦人的空白部分, 即分割线的宽度 == 屏幕的宽度)。

那么下面我就讲一讲该如何去掉空白的部分,显示完整的分割线。

这里我提供两种方法 :

第一种方法,也是我们最常用的方法,也是在我们自定义cell的时候所用到的. 即去掉tableview默认的分割线,自定义cell,重写setframe: 方法即可

下面是具体代码实现:

步骤一 : 移除系统默认的分割线

// 设置分割线的样式为none.
self.tableview.separatorstyle = uitableviewcellseparatorstylenone;

tableview有个separatorstyle属性, 即分割线的样式.这是一个枚举类型. 我们按着command点击它进入他的属性中会发现如下代码:

typedef ns_enum(nsinteger, uitableviewcellseparatorstyle) {
 uitableviewcellseparatorstylenone, //不显示分割线 
 uitableviewcellseparatorstylesingleline,// 单线 
 uitableviewcellseparatorstylesinglelineetched
 // 这种分离式仅支持分组样式表视图
 // this separator style is only supported for grouped style table views currently
}

步骤二 : 重写setframe: 方法

注意重写setframe: 方法是需要我们写在uitableviewcell中的, 上面也说过,这种方法适用于自定义cell.

下面是代码:

- (void)setframe:(cgrect)frame {
 frame.origin.y += 1;  // 让cell的y值增加1(根据自己需要分割线的高度来进行调整)
 frame.size.height -= 1; // 让cell的高度减1
 [super setframe:frame]; // 别忘了重写父类方法
}

通过上面两个步骤,就会去掉系统默认的分割线,生成我们自己的分割线. 这种方法是不是很简单呢? 如果需要自定义分割线的颜色,只需要设置`separatorcolor`为你需要的颜色就可以啦.

第二种方法也很简单,此方法不需要我们自定义cell,使用默认的tableviewcell也可以成功.这里需要说明说的是:

     ios7中,uitableviewcell左侧会有默认15像素的空白.设置setseparatorinset:uiedgeinsetszero 能将空白去掉.

     ios8中,setseparatorinset:uiedgeinsetszero 的设置已经不起作用了.

下面是解决办法,首先在viewdidload方法加入以下代码:

if ([self.tableview respondstoselector:@selector(setseparatorinset:)]) {
// 如果tableview响应了setseparatorinset: 这个方法,我们就将tableview分割线的内边距设为0.
  [self.tableview setseparatorinset:uiedgeinsetszero];
}
if ([self.tableview respondstoselector:@selector(setlayoutmargins:)]) {
// 如果tableview响应了setlayoutmargins: 这个方法,我们就将tableview分割线的间距距设为0.
  [self.tableview setlayoutmargins:uiedgeinsetszero];
}

然后在uitableview的代理方法中加入以下代码

- (void)tableview:(uitableview *)tableview willdisplaycell:(uitableviewcell *)cell forrowatindexpath:(nsindexpath *)indexpath {
// 这两句的含义跟上面两句代码相同,就不做解释了
 if ([cell respondstoselector:@selector(setseparatorinset:)]) {
   [cell setseparatorinset:uiedgeinsetszero];
  }
 if ([cell respondstoselector:@selector(setlayoutmargins:)]) {
   [cell setlayoutmargins:uiedgeinsetszero];
  }
}

总结

以上就是这篇文章的全部内容了,通过上述两个步骤也可以实现让cell 的分割线完整的显示出来. 小伙伴们,赶紧试试吧.  如果有什么更好的办法,或者是其他的思路可以留言交流。 同时非常欢迎提出宝贵的意见.希望本文的内容对大家的学习或者工作能带来一定的帮助。