關(guān)于UITableViewCell
的分割線坎缭,網(wǎng)上有無數(shù)的教程竟痰,,但是許多真的用起來卻毫無作用掏呼。這讓很多人最后只能隱藏系統(tǒng)分割線坏快,自己畫一條。
我也遇到了這個坑憎夷,又不太甘心采用自己畫線的方法莽鸿。在閱讀一些資料后,大概整理了下,分享出來祥得,希望以后更多的的人可以繞過這個坑兔沃。
很多網(wǎng)上搜索來的解決分案,大多是级及,設(shè)置separatorInset
屬性(iOS7 之后加入的)乒疏,這個屬性定義了分割線到左右邊界的距離(注:separatorInset
雖然是UIEdgeInsets
類型,但是只有左右屬性有效)饮焦。 實際上缰雇,在iOS7確實是這樣設(shè)置確實有效,這也是為什么很多blog給出這樣的方案追驴。
可械哟,現(xiàn)在實際上,這并不一定能行得通殿雪,很多時候你會發(fā)現(xiàn)暇咆,這個屬性并沒有達到預期的效果。原因是iOS8之后增加了這樣一個屬性preservesSuperviewLayoutMargins
丙曙,它的作用是 設(shè)置視圖是否保留父視圖的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,即不保留父視圖約束索抓。然而钧忽,實際情況并不一定是這樣。經(jīng)過驗證逼肯,在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
鹏倘,它由系統(tǒng)設(shè)置管理。
還有一個問題顽爹,我們會發(fā)現(xiàn)UITableView
和UITableViewCell
都有separatorInset
屬性纤泵,那么它們有什么區(qū)別呢?
分別設(shè)置镜粤,看看效果
<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
屬性捏题,設(shè)置的是全局屬性,包括未加載cell的分割線肉渴,而UITableViewCell
的separatorInset
屬性則是為指定的cell了設(shè)置inset公荧,并且優(yōu)先級高于前者。
總結(jié):設(shè)置cell的屬性同规,需要設(shè)置以下三個屬性
<pre><code>
cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
</pre></code>
其中循狰,separatorInset
可以在UITableView
進行全局設(shè)置。
這樣你就擺脫了自己畫線的尷尬境地了券勺。
需要注意的是當cell分割線設(shè)置距離邊界距離超過16后绪钥,cell距離邊界的距離也會收到影響,發(fā)生相應的改變关炼。