歷史
iOS7之前,系統(tǒng)默認(rèn)情況下的tableViewCell之間的分割線是左右兩端與屏幕邊緣之間是沒有空隙的(分割線兩邊沒有留空白)。
-
iOS7開始,默認(rèn)情況的分割線右移15像素點(diǎn),如圖:
iOS7分割線變化.png -
到了iOS8,蘋果對分割線又做出了變化,給分割線兩邊到屏幕邊緣之間添加邊緣約束margin,如圖:
iOS8分割線變化.png
系統(tǒng)的分割線樣式
- 在UITableView類中,提供了一個接口屬性,可以讓我們修改分割線的樣式(__TVOS_PROHIBITED表示該屬性tvOS不可用,iOS開發(fā)可以忽略該宏):
@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle __TVOS_PROHIBITED;
// default is UITableViewCellSeparatorStyleSingleLine 默認(rèn)情況下,分割線樣式為單條直線
- 該屬性其實(shí)是一個枚舉類型,通過該枚舉就可以指定分割線的樣式
typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) {
UITableViewCellSeparatorStyleNone,
UITableViewCellSeparatorStyleSingleLine,
UITableViewCellSeparatorStyleSingleLineEtched // This separator style is only supported for grouped style table views currently (帶浮雕效果的線條,只支持grouped風(fēng)格的tableView)
} __TVOS_PROHIBITED;
- UITableView還提供了諸如separatorColor、separatorEffect的屬性供我們?nèi)ピO(shè)置系統(tǒng)提供的分割線,大家有興趣可以自己研究一下。
全屏分割線
在開發(fā)當(dāng)中,有時候需要使用全屏的tableView分割線,這時可以有三種方式去做:
- 方式一:自定義分割線
- 設(shè)置tableView的separatorStyle屬性
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
- 在cell的底部添加一個高度為1的自定義UIView
- 方式二:設(shè)置tableView屬性
- 設(shè)置tableView和tableViewCell的屬性
// 設(shè)置tableView的分割線內(nèi)邊距為0
self.tableView.separatorInset = UIEdgeInsetsZero;
// 設(shè)置tableViewCell的邊距為0(iOS8新特性,需要加入iOS8以上的版本才調(diào)用的判斷)
cell.layoutMargins = UIEdgeInsetsZero
- 方式三:重寫cell的setFrame
- 首先普及一下tableViewCell尺寸設(shè)置的底層實(shí)現(xiàn)邏輯
- cell的位置尺寸誰計(jì)算:tableView
- cell的位置尺寸什么時候計(jì)算:一開始就會把所有cell的位置全部計(jì)算好,并保持在一個數(shù)組里,最終調(diào)用setFrame方法設(shè)置每個cell的位置尺寸cell.frame = self.frames[i]
- 了解底層實(shí)現(xiàn)邏輯之后,解決方案也就出來了:
(方案思路:通過重寫cell的setFrame方法,使cell的高度減少一個像素點(diǎn),這樣cell與cell之間就會有1個像素點(diǎn)的空隙,空隙顯示的是tableView的背景顏色,此時設(shè)置該背景顏色就可以達(dá)到全屏分割線的效果)- 取消系統(tǒng)的分割線
- 首先普及一下tableViewCell尺寸設(shè)置的底層實(shí)現(xiàn)邏輯
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
2. 設(shè)置tableView背景色為分割線的顏色
self.tableView.backgroundColor = [UIColor redColor]; // 該顏色將顯示為分割線的顏色
3. 重寫cell的setFrame方法,將傳入的參數(shù)frame中的height減1
- (void)setFrame:(CGRect)frame
{
CGRect tempRect = frame;
tempRect.size.height -= 1;
[super setFrame:tempRect]; // 恢復(fù)系統(tǒng)默認(rèn)做法,傳入的值為改變之后的frame
}

