iOS 7 UITableView:如何去除导航栏和第一个单元格之间的空白间隙

60
问题描述:在iOS 7中,使用分组的UITableView时,表格视图顶部和第一个单元格之间会出现间隙。
奇怪的是,当我首次加载内容时,表格看起来很好(第一张图片),但是当我向下滚动时,顶部和第一个单元格之间出现了空白(第二张图片): enter image description here enter image description here 使用纯样式时,不会出现这种情况,但不幸的是我需要使用分组的表格视图样式。请问有什么想法吗?

你是否偶然实现了这个协议?- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section - mmackh
不需要,因为我不需要该部分的标题。 - Fry
你有给TableView/TableView的ScrollView添加任何插图吗? - mmackh
抱歉 :( 我们没有任何想法(没有看到任何实际的代码)。 - mmackh
你最近有没有修改过表头(无论是 section 还是 table view)的内容?比如 viewForHeader... 更好的做法是,你实现了哪些 tableView 协议方法? - Lord Zsolt
显示剩余3条评论
16个回答

132

只需将此代码添加到您的ViewDidLoad方法中即可。

self.automaticallyAdjustsScrollViewInsets = NO;

1
这应该是正确的答案。注意:进一步的插入可能需要调整,但这避免了任意值。 - johncblandii
9
但是这会破坏布局,且表格视图可能会出现在导航头之下。 - Marcin
我也遇到了同样的问题,这个解决方案对我有用;我在一个nib中有一个tableView,并希望主视图在导航栏下延伸,但是我希望tableView(作为子视图)不显示tableView顶部的额外白色空间。 - Fang Chen
1
+1 我已经尝试了两天来解决UITabViewController的类似问题。我能够通过你的解决方案解决我的问题。谢谢伙计。 - Noundla Sandeep
5
您也可以从Xcode中设置此选项,选择ViewController并在属性检查器中取消勾选AdjustsScrollViewInsets。 - vishal dharankar
显示剩余2条评论

37

对我和我的团队来说,这个答案非常有趣,并且“像魔法一样运作”。

  • 在接口生成器中,只需将表格视图移动到另一个视图下面即可。

原因:

我们注意到只有在视图层次结构中的第一个视图是UITableView时才会出现此问题。 因此,除了第一个UITableView以外的所有类似的UITableView都没有这个烦人的部分。 我们尝试将UITableView移出视图层次结构中的第一个位置,一切都按预期工作。


2
很棒的解决方案。我在视图中添加了一个空标签,在表格上方,它可以正常工作。 - emilebaizel
1
我刚刚遇到了这个问题,花费了我几个小时才找到了这个答案,真的帮了我很多。实际上,我的UITableView位于UIView对象的第一位置,而那个UIView是XIB中的根视图。我必须将某些东西移到UITableView之上才能解决这个问题。 - Leon Guan
这是我让它工作的唯一方法...为什么会发生这种情况? - knagode
如果我们有一个容器(覆盖整个屏幕且在导航栏下方),其中包含uitableview。我应该把视图(或带标签的视图)放在哪里?有什么想法吗?谢谢大家提前! - samridhgupta

16

通过在Storyboard中选择xib或控制器,进入视图控制器的属性检查器。在“布局”中取消选中调整滚动视图插图。这样可以解决问题enter image description here


2
最简单的那个可行!这应该是得票最高的 :) - Shouichi

12
如果您使用的是具有组样式并且只有1个组的UITableView,请改用普通样式来解决问题。

如果您使用的是具有组样式并且只有1个组的UITableView,请改用普通样式来解决问题。

UITableViewController *tableViewController;
tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];

1
还可以通过在Storyboard中选择TableView,然后更改属性检查器下的值来进行更改,该属性检查器位于实用程序面板(右侧面板)中。 - Michael M. Myers

5

在 grouped 类型的 tableView 中,最简单的解决方案是:

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

3
为解决这个问题,请确保您在视图控制器上取消选中此字段:
在视图控制器 >> 属性检查器 >> 布局(取消选中 - 调整滚动视图插入)

enter image description here

如果这还不够,尝试在TableView上将样式设置为“Plain”:

Example image

这将解决你的问题


1
哇,第二个项目对我很有帮助。之前没想到这个,差点把头敲在桌子上了。 - Michael McKenna

2

大家好!我遇到了同样的问题。TableView在导航栏和第一个单元格之间出现了空白。这段代码帮助了我:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return 10;
    }
    else return 2;
}

1
在viewDidLoad()中加入以下代码,我成功地去除了导航栏和第一个单元格之间的间隙。
self.tableView.contentInsetAdjustmentBehavior = .never

我尝试使用静态表视图(样式:分组)。


1
在UITableView本身上方和单元格之间有一段空间。 我在两个不同的答案中找到了解决方案..再次发布,以便没有人错过这两个解决方案。 以下是去除上方空间的方法:
self.automaticallyAdjustsScrollViewInsets = NO;

将UITableView的“Style”属性设置为“Plain”,这将删除单元格下面的空白。


1

我正在使用 Xcode 7.3.1, iOS9, 和 swift 2 进行编程。我想分享一下对我有效的方法:

只需在你的 ViewDidLoad 方法中添加以下内容:

self.automaticallyAdjustsScrollViewInsets = false;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接