1. 程式人生 > >UITableViewStyleGrouped模式下多余間距

UITableViewStyleGrouped模式下多余間距

run 這樣的 board boa ini sca 隱藏 attr ide

第一個section上邊多余間距處理

// 隱藏UITableViewStyleGrouped上邊多余的間隔
_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, CGFLOAT_MIN)];

每個section下邊多余間距處理

// 隱藏UITableViewStyleGrouped下邊多余的間隔
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}
  • 備註:若傳入的 height == 0,則 height 被設置成默認值
  • 若 height 小於屏幕半像素對應的高度,則不會被渲染,所以這裏返回CGFLOAT_MIN,其實返回0.01也是可以的

補充:代碼順序的不同導致第一個section上邊出現多余間距

  • 在設置代理設置tableFooterView,上邊會出現多余間距
tableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
tableView.tableFooterView = [UIView new];
tableView.delegate = self;
tableView.dataSource = self;
  • 在設置代理設置tableFooterView,上邊不會出現多余間距
tableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
tableView.delegate = self;
tableView.dataSource = self;
tableView.tableFooterView = [UIView new];
  • 可以通過第一個section上邊多余間距處理的辦法來解決因代碼順序導致的上述問題,所以這裏建議要解決第一個section上邊多余間距還是通過文章開頭所說的解決辦法更好

在 Storyboard 中 0 代碼搞定

沒用 Storyboard 的同學使用上面的代碼就 OK 了; 而在 Storyboard 中可以 0 代碼搞定這個事:

首先,在第一個 Section 的上面拖進來一個空 UIView

技術分享圖片

然後選中這個 UIView 的 Runtime Attributes 欄,添加一個 frame 的 KeyPath

技術分享圖片

這樣頭部的間隔就乖乖的不見了:

技術分享圖片

刨根問底 UITableViewHeader 的貓膩

為什麽剛才說 0.1 和 CGFLOAT_MIN 是等效的呢?經過研究,這個高度值的影響大概是這樣的:

  1. 若傳入的 height == 0,則 height 被設置成默認值
  2. 若 height 小於屏幕半像素對應的高度,這個 header 不在另一個像素渲染

半像素也就是 1.0 / scale / 2.0,如在 @2x 屏上是 0.25
直觀的感受下,假如這個 height 被設置成 0.5 的樣子:
技術分享圖片

導航欄下面的陰影線看上去寬了 0.5 像素的,Done。

參考文章

  • 0代碼隱藏GroupedTableView上邊多余的間隔
  • UITableViewStyleGrouped類型的UITabelView使用技巧

UITableViewStyleGrouped模式下多余間距