参考https://www.jb51.net/article/82465.htm
1, self.automaticallyAdjustsScrollViewInsets = NO;
顶部的空白距离是64(20状态栏和44的navigationBar的距离)
这个应该是最常见而且不容易被发现的原因,起因是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高度设置问题
顶部的空白距离是40,而且只有当tableView的style为UITableViewStyleGrouped才会出现;
这个应该是新手遇到的比较多的。起因是iOS奇葩的逻辑,如果你设置header(或者footer)高度是0的话,系统会认为你没设置,然后将其设置为40.f。所以需要将其设置为一个较小的数:
?
1 2 3 |
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0 .001f;
} |
和3很像是不是?没发现区别吗?那就再读一次看看。这次是tableview的header视图引起的,而不是section的header高度引起。
对于tableview,不仅每个section有header,tableview整体也有header和footer,API如下:
?
1 2 |
@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 |
?
1 2 3 4 5 6 |
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];
|
当然,如果有的时候真的只需要其中一个view的话该怎么办呢?请如下设置:(似不似傻,自己建一个view呗,非得用着恶心的东西么...)
?
1 2 |
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)];
|
【UITableView顶部多出一截空白问题】关于tableView顶部空白的总结基本就这些了,如果想屏蔽的话,建议把这些写在baseTableViewController里面,这样就不用每次都扣这些东西了。宏懒得粘了,都是常见的,大家应该都能看懂。navigationbar那个,因为这个东西一般不在这里设置,写在base里面不是一个好的做法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
// // 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 |