關(guān)于分割線的那些事

歷史

  • 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á)到全屏分割線的效果
      1. 取消系統(tǒng)的分割線
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
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容