关于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
,它由系统设置管理。
还有一个问题,我们会发现UITableView
和UITableViewCell
都有separatorInset
属性,那么它们有什么区别呢?
分别设置,看看效果
<pre><code>
tableView.separatorInset = UIEdgeInsetsMake(0.0, 30.0, 0.0, 0.0);
tableView.separatorColor = [UIColor redColor];
tableView.backgroundColor = [UIColor lightGrayColor];
</pre></code>
<pre><code>
cell.separatorInset = UIEdgeInsetsMake(0.0, 5 * indexPath.row, 0.0, 0.0);
// cell.separatorInset = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
</pre></code>
效果图:
简单来看UITableView
的separatorInset
属性,设置的是全局属性,包括未加载cell的分割线,而UITableViewCell
的separatorInset
属性则是为指定的cell了设置inset,并且优先级高于前者。
总结:设置cell的属性,需要设置以下三个属性
<pre><code>
cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
</pre></code>
其中,separatorInset
可以在UITableView
进行全局设置。
这样你就摆脱了自己画线的尴尬境地了。
需要注意的是当cell分割线设置距离边界距离超过16后,cell距离边界的距离也会收到影响,发生相应的改变。