一, 在隱藏系統(tǒng)導(dǎo)航欄的時(shí)候, UITableView 內(nèi)容默認(rèn)向下偏移量
1. 自定義狀態(tài)欄代替系統(tǒng)狀態(tài)欄
為了響應(yīng)產(chǎn)品需求, 需要把用特殊樣式的導(dǎo)航欄, 因此需要隱藏系統(tǒng)的狀態(tài)欄, 用自定義的狀態(tài)欄代替.
2. 層次結(jié)構(gòu)圖
1> 使用層次結(jié)構(gòu)圖觀察, UITableView的位置時(shí)正常的, 里面的UITableViewWrapperView 向下偏移了20個(gè)點(diǎn).
2> ① UITableViewWrapperView的初始時(shí)偏移, 滑動(dòng)時(shí)不偏移.
② 在彈幕內(nèi)容量超過(guò)一頁(yè)的時(shí)候, 向上拖拽到底部, 再看層次結(jié)構(gòu), UITableViewWrapperView沒(méi)有發(fā)生偏移了.
3> 可以推斷出, UITableView的 contentInset 發(fā)生了變化.
4> contentInset 只會(huì)改變 scrollview 內(nèi)容的起點(diǎn)平衡位置, 不會(huì)改變它的滑動(dòng)范圍(contentSize).
3. UIViewController 的 automaticallyAdjustsScrollViewInsets屬性
1> 想起了之前遇到過(guò)的一個(gè)屬性 automaticallyAdjustsScrollViewInsets屬性, 設(shè)置成 NO 以后, 徹底根治這個(gè)問(wèn)題了.
2>該屬性的默認(rèn)值是YES, 作用就是當(dāng)導(dǎo)航欄隱藏時(shí), 系統(tǒng)會(huì)根據(jù)狀態(tài)欄的顯示或隱藏, 確定是否更改當(dāng)前控制器 view 中的 scrollview 的 contentInset.
3> 使用組合原理, 對(duì)狀態(tài)欄和導(dǎo)航欄分別進(jìn)行了顯示和隱藏操作.
4> 結(jié)論1: 只要導(dǎo)航欄不隱藏, 控制器的 view 的 frame 就會(huì)從導(dǎo)航欄的底部開(kāi)始算起...只有導(dǎo)航欄隱藏, 控制器的 view 的 frame 才會(huì)從狀態(tài)欄的起點(diǎn)開(kāi)始算起.
5> 結(jié)論2: 只有在導(dǎo)航欄隱藏的時(shí)候, 控制器 view 和狀態(tài)欄 frame 的起點(diǎn)才會(huì)一致, 如果狀態(tài)欄不隱藏, 就會(huì)在一開(kāi)始遮住 scrollview 的頂部....
因此需要在保證 scrollview 的 frame 不變的情況下, 讓 scrollview 有一個(gè)默認(rèn)的初始的向下偏移量.
二, UITableView的底部多余的cell和下劃線
1> UITableView在 tableFooterView 屬性為空的時(shí)候, 會(huì)顯示很多 cell.
2> 可以使用tableView.tableFooterView = [UIView new]
代碼, 來(lái)讓 tableview 停止顯示 cell.