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