iOS開發-關於UITableView去掉粘性的問題
關於UITableView去掉header/footer粘性的問題,博主也曾經遇到過並解決,今天一朋友問起來,所以回頭來說說這個問題,並不很高明,都是一些小經驗罷了。
去掉粘性,去百度的話,你會看到大堆大堆的幾乎一樣的程式碼:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat sectionHeaderHeight = 40;
if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset .y>=0) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
}
else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}
以上程式碼就是網上比較常見的方法,現在來做個分析,為什麼要用上面的方法呢?如果你用UITableViewStylePlain模式,是有粘性的,如果不需要粘性,UITableViewStyleGroup是最好的選擇,然後牽涉到上面的方法,為什麼不好用呢,因為上面的程式碼只對一個分組或者對擁有多個一樣高度的header的分組管用,如果我有不確定個分組,高度也不確定,上面的方法可以說是沒一點用,所以為什麼不用UITableViewStyleGroup模式呢?
有人說系統會預設給頁首頁尾,也就是header和footer,如果不寫header和footer的代理或者給0,header和footer會都顯示且系統預設會給一個非0的高度,具體多少記不清了,如果你不想使用header或footer其中的一項你完全可以通過設定極小的高度隱藏的:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.001; //不能為0,否則為預設高度
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger )section
{
return 0.001; //不能為0,否則為預設高度
}
header,footer都會有預設高度,所以你在設定header高度的時候會發現總是多了那麼一點,大概有20,那其實是footer的高度,所謂的頁首頁尾,只需要按照上面的方法設定即可,肉眼是無法發現的,然後就可以通過
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
來自定義header的內容。這種情況下想要去掉粘性只需要用分組模式即可。實際上多分組且各個header不一的情況,通過設定footer為極小數來欺騙肉眼,再設定header高度並自定義的方法是最好的解決辦法。
總結:如果使用分組模式,header和footer的高度是一定要設定的,切記,不需要使用它就設定為0.001這樣的極小數且不能為0;使用plain模式,那麼最好是沒有分組(tableView.tableHeaderView這個方法大家知道,不需要設定分組的),如果用了分組且想去掉粘性,如果是header高度都一樣的情況,最上面那個scrollView的代理方法是可以奏效的,否則還是選擇group分組模式,具體怎麼做,上面已經給出,請認真看,如有問題,歡迎加群詢問。