UITableViewStyle有兩個選項(xiàng):UITableViewStylePlain和UITableViewStyleGrouped盐欺。
contentInset:scrollview的contentView(即滾動的那部分view拐叉,以下都以這個簡稱)的頂點(diǎn)相對于scrollview的位置,例如你的contentInset = (0 ,100)吩坝,那么你的contentview就是從scrollview的(0 ,100)開始顯示
Plain模式
Plain的效果如圖:(灰色底是tableView的父view,藍(lán)色底是tableView哑蔫,下同)
上圖是sectionHeader和sectionFooter高度設(shè)置為20的情況钉寝。為了方便,下文直接用header和footer來表示闸迷。
- header默認(rèn)會固定在tableView的頂部嵌纲,因?yàn)閺梽有Ч淖兾恢茫?/li>
- footer默認(rèn)會固定在tableView的底部(數(shù)據(jù)不夠時(shí),會緊跟著cell)腥沽,因?yàn)閺梽有Ч淖兾恢谩?/li>
假設(shè)你做了如下設(shè)置逮走,那么最后一個cell的分割線會沒掉。就同我上圖一樣今阳,設(shè)置了footerHeight后师溅,系統(tǒng)會以為底部有內(nèi)容茅信,所以最后一個cell的分割線不會給出來。返回0.01其實(shí)也是有內(nèi)容在的墓臭,只不過我們眼睛看不出來而已蘸鲸。
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0.01;
}
當(dāng)tableView的contentInset設(shè)置為UIEdgeInsetsMake(10, 0, 10, 0),如下圖所示
- 可以看出header和footer不再固定在tableView的頭部和底部窿锉,而是偏移了10個像素點(diǎn)酌摇。
- 由于這個間隙,導(dǎo)致contentView滾動的內(nèi)容會出現(xiàn)在這部分的間隙中嗡载。
但當(dāng)tableView的contentInset設(shè)置為UIEdgeInsetsMake(-20, 0, -20, 0)窑多,如下圖
這兩張圖可以看出,無論inset怎么設(shè)置洼滚,header和footer都是contentView的頭部和底部埂息。只要header和footer是處于屏幕顯示內(nèi)的,那么就只有當(dāng)滾動內(nèi)容到頭/尾了判沟,才會跟著滾動滾動耿芹。而如果處于屏幕之外的,就一定是緊跟著滾動內(nèi)容挪哄。
于是乎吧秕,網(wǎng)友提出了這樣一個方法來讓Plain模式下的header和footer不固定在頭部和底部
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat sectionHeaderHeight = 40;
CGFloat sectionFooterHeight = 10;
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY >= 0 && offsetY <= sectionHeaderHeight)
{
scrollView.contentInset = UIEdgeInsetsMake(-offsetY, 0, -sectionFooterHeight, 0);
}else if (offsetY >= sectionHeaderHeight && offsetY <= scrollView.contentSize.height - scrollView.frame.size.height - sectionFooterHeight)
{
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, -sectionFooterHeight, 0);
}else if (offsetY >= scrollView.contentSize.height - scrollView.frame.size.height - sectionFooterHeight && offsetY <= scrollView.contentSize.height - scrollView.frame.size.height)
{
scrollView.contentInset = UIEdgeInsetsMake(-offsetY, 0, -(scrollView.contentSize.height - scrollView.frame.size.height - sectionFooterHeight), 0);
}
}
Grouped模式
Grouped的效果如圖:
- header和footer就是contentView對應(yīng)view的頭部和尾部。
很多人在使用Grouped模式時(shí)迹炼,會遇到一個問題砸彬,就是tableView的頂部和底部都會留白,這里說下我收集到的處理方法斯入。
- self.automaticallyAdjustsScrollViewInsets = NO在控制器設(shè)置
- tableView.tableFooterView = [[UIView alloc] init]切記這段必須要放在tableView的兩個代理設(shè)置之后(我也才是抄來的)
但是砂碉,請記住,不管是上面的哪個方法刻两,必須配合設(shè)置以下兩個方法才能去掉兩個留白部分增蹭。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 0.01;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0.01;
}
當(dāng)tableView的contentInset設(shè)置為UIEdgeInsetsMake(10, 0, 10, 0),如下圖所示
有沒有一種很像contentOffset偏移的感覺
更新2017-05-25
樓主最近又發(fā)現(xiàn)了tableView使用UITableViewStyleGrouped底部會留空磅摹,百般嘗試后沒法子滋迈,直接用self.tableView.contentInset = UIEdgeInsetsMake(0, 0, -20, 0);呵呵噠...