我曉得沒人會自動設置這個器械,然則年夜家必定都碰到過這個成績,上面總結下能夠是哪些情形:
1, self.automaticallyAdjustsScrollVieWinsets = NO;
這個應當是最多見並且不輕易被發明的緣由,原由是IOS7在Conttoller中新增了automaticallyAdjustsScrollVieWinsets這個屬性,當設置為YES時(默許YES),假如視圖外面存在獨一一個UIScrollView或其子類View,那末它會主動設置響應的內邊距,如許可讓scroll占領全部視圖,又不會讓導航欄隱瞞。
PS:IOS7外面的結構成績挺多的,應用autolayout的時刻會碰到很多多少,年夜概是由於IOS7新參加autolayout還還不成熟招致的吧。
2,navigationbar設置成績
固然外面上看是tableview頂部有空白,但現實上能夠是由於navigationbar設置成績招致。
self.navigationController.navigationBar.translucent = NO; 這個屬性設為no以後,tableview會在上方留出64.f的地位給navigationbar,也有小幾率招致這個成績。
3,tableview section header高度設置成績
這個應當是老手碰到的比擬多的。原由是iOS奇葩的邏輯,假如你設置header(或許footer)高度是0的話,體系會以為你沒設置,然後將其設置為40.f。所以須要將其設置為一個較小的數:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0.001f; }
4,tableview的header、footer設置成績
和3很像是否是?沒發明差別嗎?那就再讀一次看看。此次是tableview的header視圖惹起的,而不是section的header高度惹起。
關於tableview,不只每一個section有header,tableview全體也有header和footer,API以下:
@property (nonatomic, strong, nullable) UIView *tableHeaderView; // Accessory view for above row content. default is nil. not to be confused with section header @property (nonatomic, strong, nullable) UIView *tableFooterView; // Accessory view below content. default is nil. not to be confused with section footer
這個header和footer要比section的header要協調一些,只需你不去自動碰它就沒事,然則假如你碰了...哼,哼...根本上會被設置出40.f高的間距。湧現以下隨意率性一行代碼均會惹起這個成績:
self.tableView.tableHeaderView = nil; self.tableView.tableHeaderView = [[UIView alloc] init]; self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectZero]; self.tableView.tableFooterView = nil; self.tableView.tableFooterView = [[UIView alloc] init]; self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
對,你沒想錯,footerView也不克不及設置,footer和header只需設置了隨意率性一個都邑使兩個處所都湧現空白。不要問我為何...
固然,假如有的時刻真的只須要個中一個view的話該怎樣辦呢?請以下設置:(似不似傻,本身建一個view呗,非得用著惡心的器械麼...)
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)]; self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)];
說白了,照樣得設置成一個很小的高度,而不是0才行。
關於tableView頂部空白的總結根本就這些了,假如想屏障的話,建議把這些寫在baseTableViewController外面,如許就不消每次都扣這些器械了。宏懶得粘了,都是罕見的,年夜家應當都能看懂。navigationbar誰人,由於這個器械普通不在這裡設置,寫在base外面不是一個好的做法。
// // HLNBaseTableViewController.m // HLN-IMDemo // // Created by heiline on 15/8/25. // Copyright (c) 2015年 百度. All rights reserved. // #import "HLNBaseTableViewController.h" @interface HLNBaseTableViewController () @end @implementation HLNBaseTableViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = [[UITableView alloc] initWithFrame:(CGRect){CGPointZero, kScreenSize} style:_tableViewStyle]; [self.view addSubview:self.tableView]; self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)]; self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 0.0001f)]; if (self.navigationController != nil) { self.tableView.height -= kNavBarH + kStatusBarH; } if (self.tabBarController != nil) { if (self.navigationController.childViewControllers.count == 1) { self.tableView.height -= kTabBarH; } } self.tableView.delegate = self; self.tableView.dataSource = self; self.automaticallyAdjustsScrollVieWinsets = NO; } - (void)dealloc { self.tableView.dataSource = nil; self.tableView.delegate = nil; } #pragma mark Table View Data Source And delegate Methods -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 0; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 0; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { return [[UITableViewCell alloc] init]; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { } - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return nil; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { return nil; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0.001f; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 40.f; } -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return 0.001f; } @end
【詳解iOS開辟中UITableview cell 頂部空白的多種設置辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!