本篇文章主要有兩個內容:1. 正確認識全屏分割線的設置 2. 去除沒有數據的Cell或者指定Cell的分割線
畢竟這里只是我自己本人的看法和總結 -- 有什么建議或者覺得我說得不好的地方,歡迎互相探討。畢竟探討越多提升越大~~
----PART One----
首先是我一直覺得很不爽的全屏分割線(為何不爽,看完這一部分大家應該也能理解我的感受)
自定義Cell的情況
- 把系統的分割線隱藏,然后自己創建一個高度為1的UIVIew添加到Cell的底部或者頂部
- 把系統的分割線隱藏,然后設置tableview的背景色為自己想要的分割線顏色,重寫Cell的setFrame方法,把高度減1(需要的話還可以把寬度也減一點點,會有不一樣的效果~)
- 設置Cell的
separatorInset = UIEdgeInsetsZero 、 layoutMargins = UIEdgeInsetsZero
- 或者設置tableview的
separatorInset = UIEdgeInsetsZero
、再設置Cell的layoutMargins = UIEdgeInsetsZero
不自定義Cell的情況
- 設置Cell的
preservesSuperviewLayoutMargins = NO、separatorInset = UIEdgeInsetsZero 、 layoutMargins = UIEdgeInsetsZero
- 或者設置tableview的
separatorInset = UIEdgeInsetsZero
、再設置Cell的preservesSuperviewLayoutMargins = NO、layoutMargins = UIEdgeInsetsZero
其實嘛,之所以會有邊距都是
separatorInset
和layoutMargins
這兩個屬性作祟,tableview和Cell同時都有這兩個屬性導致了兩個單位的偏移,而separatorInset這個無論tableview設置還是Cell設置都是一樣可以減少一個單位的偏移(即使兩個都設置了也只是減一個單位)
另外一個重要原因是layoutMargins
這個屬性,當你沒有設置這個屬性的時候,它會默認有{8,8,8,8}
的偏移量,但是呢,即使你設置了tableview的layoutMargins=UIEdgeInsetsZero
,你也會發現沒用。這是因為另一個屬性preservesSuperviewLayoutMargins
又在作怪,這個屬性的意思是保持父控件的layoutMargins屬性的行為(大概吧(霧...))默認是NO。也就是說,Cell本身的layoutMargins還是默認的{8,8,8,8}
,因此還是有一個單位的偏移。。。但是啊但是(好多但是→_→)即使設置為YES也并沒有什么效果,因為呀,Cell的父視圖并不是TableView呢...而是一個叫UITableviewWrapperView的
此外,當你使用系統默認的UITableviewCell類的時候,preservesSuperviewLayoutMargins默認是為YES的,而自定義Cell的時候這個屬性會自動置為NO
因此,我在這里要重新說明如何自定義TableView全屏的分割線
如果自定義Cell的話只需要設置 tableview 或者 Cell的 separatorInset = UIEdgeInsetsZero
以及Cell的的layoutMargins =UIEdgeInsetsZero
這簡單的兩步就可以了!!!
如果使用系統的是UITableviewCell類的話就再多加上preservesSuperviewLayoutMargins = NO
這句就可以了
----PART Two----
去除沒有數據的Cell或者指定Cell的分割線
? 想要去除沒有數據的Cell的分割線的話非常簡單,只需要設置tableviewFootView為一個空的View,那么下面沒有數據的Cell的就不會顯示了
Snip20160414_4.png
? 另外一個是因為前幾天剛好遇見個需求,就是要去除指定的某一個Cell的分割線。那我們其實就可以利用
separatorInset
來完成這個需求
只需要把分割線移除屏幕外或者把它壓縮為0像素就可以了
Snip20160416_6.png
效果很容易就達到了~~
Snip20160414_6.png
最后說幾句---關于preservesSuperviewLayoutMargins屬性還是無法理解它的作用...看了蘋果文檔,大概意思是如果設為Yes的話,則父控件內容的左邊距會留出一個最小間距出來。雖然我說了Cell的父控件是UITableviewWrapperView,而且在CellForRow數據源方法中也拿不到它(因為Cell要在該方法返回后才被系統使用并添加到父控件上),但是即使我在其他能拿到的地方拿到它了,并且設置了它的
layoutMargins =UIEdgeInsetsZero和Cell的preservesSuperviewLayoutMargins = YES,可惜卻也完全沒有效果...如果大家有什么見解希望能告知一聲~~~
至此,我的個人見解說完了,謝謝大家的閱讀~~~