欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解iOS开发中UITableview cell 顶部空白的多种设置方法

程序员文章站 2023-11-28 22:04:10
我知道没人会主动设置这个东西,但是大家一定都遇到过这个问题,下面总结下可能是哪些情况:   1, self.automaticallyadjustsscrollvie...

我知道没人会主动设置这个东西,但是大家一定都遇到过这个问题,下面总结下可能是哪些情况:

  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年 baidu. 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