详解iOS开发中UITableview cell 顶部空白的多种设置方法
我知道没人会主动设置这个东西,但是大家一定都遇到过这个问题,下面总结下可能是哪些情况:
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,tableviewsectionheader高度设置问题
这个应该是新手遇到的比较多的。起因是iOS奇葩的逻辑,如果你设置header(或者footer)高度是0的话,系统会认为你没设置,然后将其设置为40.f。所以需要将其设置为一个较小的数:
-(CGFloat)tableView:(UITableView*)tableViewheightForHeaderInSection:(NSInteger)section{ return0.001f; }
4,tableview的header、footer设置问题
和3很像是不是?没发现区别吗?那就再读一次看看。这次是tableview的header视图引起的,而不是section的header高度引起。
对于tableview,不仅每个section有header,tableview整体也有header和footer,API如下:
@property(nonatomic,strong,nullable)UIView*tableHeaderView;//accessoryviewforaboverowcontent.defaultisnil.nottobeconfusedwithsectionheader @property(nonatomic,strong,nullable)UIView*tableFooterView;//accessoryviewbelowcontent.defaultisnil.nottobeconfusedwithsectionfooter
这个header和footer要比section的header要和谐一些,只要你不去主动碰它就没事,但是如果你碰了...哼,哼...基本上会被设置出40.f高的间距。出现如下任意一行代码均会引起这个问题:
self.tableView.tableHeaderView=nil; self.tableView.tableHeaderView=[[UIViewalloc]init]; self.tableView.tableHeaderView=[[UIViewalloc]initWithFrame:CGRectZero]; self.tableView.tableFooterView=nil; self.tableView.tableFooterView=[[UIViewalloc]init]; self.tableView.tableFooterView=[[UIViewalloc]initWithFrame:CGRectZero];
对,你没想错,footerView也不能设置,footer和header只要设置了任意一个都会使两个地方都出现空白。不要问我为什么...
当然,如果有的时候真的只需要其中一个view的话该怎么办呢?请如下设置:(似不似傻,自己建一个view呗,非得用着恶心的东西么...)
self.tableView.tableHeaderView=[[UIViewalloc]initWithFrame:CGRectMake(0,0,kScreenSize.width,0.0001f)]; self.tableView.tableFooterView=[[UIViewalloc]initWithFrame:CGRectMake(0,0,kScreenSize.width,0.0001f)];
说白了,还是得设置成一个很小的高度,而不是0才行。
关于tableView顶部空白的总结基本就这些了,如果想屏蔽的话,建议把这些写在baseTableViewController里面,这样就不用每次都扣这些东西了。宏懒得粘了,都是常见的,大家应该都能看懂。navigationbar那个,因为这个东西一般不在这里设置,写在base里面不是一个好的做法。
// //HLNBaseTableViewController.m //HLN-IMDemo // //Createdbyheilineon15/8/25. //Copyright(c)2015年baidu.Allrightsreserved. // #import"HLNBaseTableViewController.h" @interfaceHLNBaseTableViewController() @end @implementationHLNBaseTableViewController -(void)viewDidLoad{ [superviewDidLoad]; self.tableView=[[UITableViewalloc]initWithFrame:(CGRect){CGPointZero,kScreenSize}style:_tableViewStyle]; [self.viewaddSubview:self.tableView]; self.tableView.tableHeaderView=[[UIViewalloc]initWithFrame:CGRectMake(0,0,kScreenSize.width,0.0001f)]; self.tableView.tableFooterView=[[UIViewalloc]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; } #pragmamarkTableViewDataSourceAnddelegateMethods -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{ return0; } -(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section{ return0; } -(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath{ return[[UITableViewCellalloc]init]; } -(void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath{ } -(UIView*)tableView:(UITableView*)tableViewviewForFooterInSection:(NSInteger)section{ returnnil; } -(UIView*)tableView:(UITableView*)tableViewviewForHeaderInSection:(NSInteger)section{ returnnil; } -(CGFloat)tableView:(UITableView*)tableViewheightForHeaderInSection:(NSInteger)section{ return0.001f; } -(CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath:(NSIndexPath*)indexPath{ return40.f; } -(CGFloat)tableView:(UITableView*)tableViewheightForFooterInSection:(NSInteger)section{ return0.001f; } @end