UITableViewCell分割线设置

关于UITableViewCell的分割线,网上有无数的教程,,但是许多真的用起来却毫无作用。这让很多人最后只能隐藏系统分割线,自己画一条。

我也遇到了这个坑,又不太甘心采用自己画线的方法。在阅读一些资料后,大概整理了下,分享出来,希望以后更多的的人可以绕过这个坑。

很多网上搜索来的解决分案,大多是,设置separatorInset属性(iOS7 之后加入的),这个属性定义了分割线到左右边界的距离(注:separatorInset虽然是UIEdgeInsets类型,但是只有左右属性有效)。 实际上,在iOS7确实是这样设置确实有效,这也是为什么很多blog给出这样的方案。

可,现在实际上,这并不一定能行得通,很多时候你会发现,这个属性并没有达到预期的效果。原因是iOS8之后增加了这样一个属性preservesSuperviewLayoutMargins,它的作用是 设置视图是否保留父视图的margins。这里有一个坑,也是上面的解决方案时灵时不灵的根源。
@property (nonatomic) BOOL preservesSuperviewLayoutMargins NS_AVAILABLE_IOS(8_0); // default is NO - set to enable pass-through or cascading behavior of margins from this view’s parent to its children
这是官方的注释,默认是NO,即不保留父视图约束。然而,实际情况并不一定是这样。经过验证,在UITableViewCell 加载方式不同时,这个属性的默认值并不同。

cell如果是IB加载,preservesSuperviewLayoutMargins 默认为NO,而如果是代码加载,默认值则为YES。这就是这个坑之所在。

iOS8之后,加入了layoutMargins属性,layoutMargins定义了视图边界与子视图边界之间间距,非控制器根视图默认为UIEdgeInsetsMake(8.0, 8.0, 8.0, 8.0),即上下左右各8个单位长度。控制器根视图默认为UIEdgeInsetsMake(0.0, 16.0, 0.0, 16.0)或者UIEdgeInsetsMake(0.0, 20.0, 0.0, 20.0),取决于当前size class。我们可以改变非根视图的layoutMargins,但是不可以改变根视图的layoutMargins,它由系统设置管理。

还有一个问题,我们会发现UITableViewUITableViewCell都有separatorInset属性,那么它们有什么区别呢?
分别设置,看看效果


tableView.separatorInset = UIEdgeInsetsMake(0.0, 30.0, 0.0, 0.0);

tableView.separatorColor = [UIColor redColor];

tableView.backgroundColor = [UIColor lightGrayColor];


cell.separatorInset = UIEdgeInsetsMake(0.0, 5 * indexPath.row, 0.0, 0.0);

// cell.separatorInset = UIEdgeInsetsZero;

cell.layoutMargins = UIEdgeInsetsZero;

cell.preservesSuperviewLayoutMargins = NO;


效果图:

UITableViewCell分割线设置_第1张图片
Simulator Screen Shot 2016年8月23日 下午6.18.06.png

简单来看UITableViewseparatorInset属性,设置的是全局属性,包括未加载cell的分割线,而UITableViewCellseparatorInset属性则是为指定的cell了设置inset,并且优先级高于前者。

总结:设置cell的属性,需要设置以下三个属性


cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);

cell.layoutMargins = UIEdgeInsetsZero;

cell.preservesSuperviewLayoutMargins = NO;

其中,separatorInset可以在UITableView进行全局设置。

这样你就摆脱了自己画线的尴尬境地了。

需要注意的是当cell分割线设置距离边界距离超过16后,cell距离边界的距离也会收到影响,发生相应的改变。

你可能感兴趣的:(UITableViewCell分割线设置)