从iOS7开始,在我的UITableView顶部有额外的空间它有一个UITableViewStyleGrouped样式。

这里有一个例子:

tableview从第一个箭头开始,有35个像素的无法解释的填充,然后绿色的头是一个由viewForHeaderInSection返回的UIView(其中section为0)。

有人能解释一下这个35像素的数量是从哪里来的吗?我如何才能在不切换到UITableViewStylePlain的情况下摆脱它?


更新(回答):

在iOS 11及更高版本中:

tableView.contentInsetAdjustmentBehavior = .never

当前回答

我的回答将是更一般的答案,但也可以应用在这个问题上。

如果根视图(ViewController的)或根视图的第一个子视图(子视图)是UIScrollView(或UIScrollView本身)的子类,并且如果

self.navigationController.navigationBar.translucent = YES;

框架将自动设置预先计算的contentInset。


为了避免这种情况,你可以这样做

self.automaticallyAdjustsScrollViewInsets = NO;

但在我的情况下,我不能这样做,因为我正在实现SDK,其中有UIView组件,可以由其他开发人员使用。那个UIView组件包含UIWebView(它有UIScrollView作为第一个子视图)。如果该组件被添加为UIViewController的视图层次结构中的第一个子组件,自动嵌入将被系统应用。

在添加UIWebView之前,我已经通过添加frame(0,0,0,0)来修复这个问题。

在这种情况下,系统没有找到UIScrollView的子类作为第一个子视图,并没有应用insets

其他回答

我们有很多答案。

1)你可以在view didload中添加UIImageview

UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];

2)可以设置页眉和页脚高度为0.1

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}

3)您可以添加高度为0.1的页眉和页脚视图

tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];

我有一个VC与容器在它(btw是一个导航控制器的一部分),并嵌入其中是一个TableVC。

选择我的TableVC,查看属性面板:

取消勾选自动调整滚动插入 取消检查顶部栏下的延伸边

然后我设置了容器相对于父视图的自动约束:

容器的观点。top = ParentView。顶边

这为我完成了以下任务:

保持桌面拉到顶部,但就在我的导航栏下面 刷新后,表返回到这个位置,而不是像以前那样在导航栏下向上+ 在实际的底部滚动表底部后,不缺它

我用这个设置进行了大量的试验和错误,但我最终发现了lekksi @移除UITableView单元格前的空白空间发布的这些小细节

我已经找到了我最初的bug的原因,并创建了一个示例项目来展示它。我相信有一个iOS7漏洞。

在iOS7中,如果你用分组样式创建一个UITableView,但是在第一个布局上没有设置一个委托,然后你设置了一个委托并调用reloadData,在顶部会有一个35px的空间,永远不会消失。

看这个项目我做的展示bug: https://github.com/esilverberg/TableViewDelayedDelegateBug

特别是这个文件:https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

如果第24行是活动的,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

在顶部会有一个额外的35px空间。如果第27行是活动的,第24行被注释掉,

self.tableView.delegate = self;

顶部没有空间。这就像tableView在某处缓存结果而不是在委托设置和reloadData调用后重新绘制自己。

我认为制作UIEdgeInsets -35 0 0 0是乏味的。在我的例子中,我实现了tableView: hightforheaderinsection:方法,它有可能返回0。

当我把0改成0.1f时,问题就消失了。

故事板:

只需取消勾选:在视图控制器的选项中调整滚动视图嵌入

代码:

self.automaticallyAdjustsScrollViewInsets = false