686

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

这是一个例子:

在此处输入图像描述

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

谁能解释这 35 像素的数量来自哪里以及如何在不切换到 的情况下摆脱它UITableViewStylePlain


更新(答案):

在 iOS 11 及更高版本中:

tableView.contentInsetAdjustmentBehavior = .never
4

72 回答 72

865

我得到了以下帮助:

YouStoryboard.storyboard > YouViewController > Attributes inspector > Uncheck - 调整滚动视图插图。

在此处输入图像描述

于 2013-10-01T13:36:38.223 回答
341

我又玩了一点,这似乎是设置 tableView 的副作用tableHeaderView = nil

因为我的 tableView 有一个动态出现的tableHeaderView,当我需要隐藏tableHeaderView而不是做的时候self.tableView.tableHeaderView = nil;,我做:

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

我更喜欢这个解决方案而不是设置一个有点随意contentInset.top,因为我也使用contentInset.top动态的。每次重新计算时都必须记住删除额外的 35pxcontentInset.top是很乏味的。

于 2013-09-21T23:33:59.937 回答
184

尝试更改继承自contentInset.UITableViewUIScrollView

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

这是一种解决方法,但它有效

于 2013-09-21T17:32:25.187 回答
179

对于 IOS 7,如果您在视图控制器中分配表视图,您可以查看

self.edgesForExtendedLayout = UIRectEdgeNone;

你的问题似乎和我的相似

更新:

iOS 9.x 中的 Swift:

self.edgesForExtendedLayout = UIRectEdge.None

斯威夫特 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
于 2013-09-20T21:16:04.653 回答
137
self.automaticallyAdjustsScrollViewInsets = NO;

try, you can deal with it!

于 2013-10-29T02:32:38.923 回答
80

您可以检测您的应用程序是否运行 iOS7 或更高版本,并在您的表视图委托中添加这两个方法(通常在您的 UIViewController 代码中)

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

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

这可能不是一个优雅的解决方案,但对我有用

斯威夫特版本:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}
于 2013-10-25T18:26:25.477 回答
60

我找到了原始错误的原因并创建了一个示例项目来展示它。我相信有一个iOS7错误。

从 iOS7 开始,如果你创建了一个带有 Grouped 样式的 UITableView,但在第一个布局上没有设置委托,那么你设置了一个委托并调用 reloadData,顶部将有一个 35px 的空间永远不会消失。

请参阅我制作的展示错误的项目: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];

顶部会有一个额外的 35 px 空间。如果第 27 行处于活动状态并且第 24 行被注释掉,

self.tableView.delegate = self;

顶部没有空间。就像 tableView 在某处缓存结果并且在设置委托并调用 reloadData 后不重绘自身。

于 2013-10-05T05:52:57.133 回答
49

取消选中“调整滚动视图插图”

在此处输入图像描述

于 2016-08-26T03:51:46.130 回答
46

另一个快速评论......即使在 XCode 6.1 中,也有一个错误,垂直空格出现在UIScrollViews,UITextViewsUITableViews.

在此处输入图像描述

有时,解决此问题的唯一方法是进入情节提要并拖动问题控件,使其不再是页面上的第一个子视图。

在此处输入图像描述

(感谢Oded为我指明了这个方向……我发布此评论,只是为了添加一些屏幕截图,以展示症状并进行修复。)

于 2015-01-07T08:14:21.210 回答
42

在使用分组的 TableView 时使用它来避免 viewWillAppear 中的边框切割

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
于 2014-04-29T10:43:14.720 回答
40

根据Apple的 iOS7 转换指南,滚动视图的内容插入会自动调整。automaticAdjustsScrollViewInsets的默认值设置为 YES。

具有 UITableView 的 UIViewController 应将此属性设置为 NO。

self.automaticallyAdjustsScrollViewInsets = NO;

这会成功的。

编辑1:

另外,可以尝试 -

self.navigationController.navigationBar.translucent = YES;

这也删除了顶部的额外填充。

于 2014-01-15T12:32:13.130 回答
39

上面很多以前的答案都太老套了。如果 Apple 决定修复这种意外行为,它们将在未来的任何时候中断。

问题的根源:

  1. aUITableView不喜欢高度为 0.0 的标题。如果你想要做的是有一个高度为 0 的标题,你可以跳转到解决方案。

  2. 即使稍后您为标题分配了非 0.0 的高度,aUITableView也不喜欢最初分配高度为 0.0 的标题。

解决方案:

然后,最简单可靠的解决方法是确保将标题高度分配给表格视图时不为 0。

像这样的东西会起作用:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

这样的事情会在某些时候导致问题(通常是在滚动之后):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
于 2015-07-04T17:33:47.020 回答
29

故事板:

只需取消选中:Adjust Scroll View Insets在 View Controller 的选项中

在此处输入图像描述

代码:

self.automaticallyAdjustsScrollViewInsets = false
于 2015-05-21T10:29:18.017 回答
27

iOS 15 的解决方案:

if #available(iOS 15.0, *) {
  tableView.sectionHeaderTopPadding = 0
}

在整个项目中修复:

if #available(iOS 15.0, *) {
    UITableView.appearance().sectionHeaderTopPadding = 0
}

更多详细信息:iOS 15 中表格视图标题上方的额外填充

于 2021-10-05T17:37:58.317 回答
24

这是使用 Swift 3 的 iOS 10 的解决方案:

您可以通过从UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
于 2017-01-12T16:37:34.310 回答
16

所以我在这里尝试了每一种方法,但这次没有一种方法有帮助。我的案例是 iOS 9 上的分组表格视图。我真的不知道为什么以及如何找到这个,但对我来说,设置至少高度tableViewHeader的 a 是可行的。没有帮助,没有任何帮助:UIView0.01CGRectZero

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
于 2016-07-21T13:07:29.563 回答
15

这段代码对我有用,对我来说最好的答案是在上面写的objective-C,所以我把它转换成 Swift。

对于 Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: .leastNonzeroMagnitude))

只要把它写进去viewDidLoad(),它就会像一个魅力一样工作。

对于 iOS 15+,以上一个不起作用,所以使用这个:-

 if #available(iOS 15.0, *) {
      tableView.sectionHeaderTopPadding = 0
 }

对于 iOS 15+,如果您想为整个项目应用更改,请使用以下命令:-

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    if #available(iOS 15.0, *) {
        UITableView.appearance().sectionHeaderTopPadding = 0.0
    }
}
于 2019-05-16T06:19:27.327 回答
14

In my case this was what helped me. I'm supporting ios6 also.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
于 2013-09-25T09:10:07.060 回答
14

只需将以下内容添加到 VC 中的 viewDidLoad 中:

self.automaticallyAdjustsScrollViewInsets = NO;
于 2014-09-20T05:20:10.433 回答
11

这就是如何通过 Storyboard在iOS 11Xcode 9.1中轻松修复它:

选择表视图 > 大小检查器 > 内容插入:从不

于 2017-11-02T08:30:25.867 回答
10

斯威夫特:iOS 我在滚动视图上有表格视图..当我在同一屏幕上单击“返回”时。滚动视图在顶部占用更多空间..为了解决这个问题,我使用了:

 self.automaticallyAdjustsScrollViewInsets = false

一个布尔值,指示视图控制器是否应自动调整其滚动视图插图。默认值为 true,它允许视图控制器调整其滚动视图插入以响应状态栏、导航栏和工具栏或选项卡栏所占用的屏幕区域。如果您想自己管理滚动视图插入调整,请设置为 false,例如当视图层次结构中有多个滚动视图时。

于 2014-11-25T07:20:36.133 回答
10

感谢@Aurelien Porte 的回答。这是我的解决方案

此问题的原因:-

  1. UITableView 不喜欢有高度为 0.0 的标题。如果你想要做的是有一个高度为 0 的标题,你可以跳转到解决方案。
  2. 即使稍后您为标题分配了非 0.0 的高度,UITableView 也不喜欢最初分配高度为 0.0 的标题。

在 ViewDidLoad 中:-

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

不需要这样的东西:-

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

heightForHeaderInSection代表中:-

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

viewForHeaderInSection代表中:-

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}
于 2016-05-30T09:42:54.670 回答
9

我假设这只是新UITableViewStyleGrouped样式的一部分。它在所有分组表视图中,似乎没有任何直接的方法来控制该空间。

如果该空间由 a 表示UIView,则可以搜索所有空间subviewsUITableView找到该特定视图并直接对其进行编辑。但是,也有可能该空间只是标题和单元格开始之前的硬编码偏移量,并且没有任何方法可以编辑它。

搜索所有子视图(我会在表格没有单元格时运行此代码,以便更容易阅读输出):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}
于 2013-09-18T20:12:28.410 回答
9

我的答案将是更一般的答案,但也可以应用于此。

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

self.navigationController.navigationBar.translucent = YES;

框架会自动设置预先计算好的 contentInset


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

self.automaticallyAdjustsScrollViewInsets = NO;

但就我而言,我无法做到这一点,因为我正在实现具有 UIView 组件的 SDK,该组件可供其他开发人员使用。该 UIView 组件包含 UIWebView (将 UIScrollView 作为第一个子视图)。如果该组件被添加为 UIViewController 视图层次结构中的第一个子组件,系统将应用自动插入。

我已经通过在添加 UIWebView 之前添加带有框架 (0,0,0,0) 的虚拟视图来解决此问题。

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

于 2015-12-02T14:20:20.923 回答
9

具体来说,要从顶部删除 tableviewHeader 空间,我进行了以下更改:

YouStoryboard.storyboard > YouViewController > Select TableView > Size inspector > Content insets - 设置为从不。

在此处输入图像描述

于 2018-04-14T12:08:56.290 回答
8

Swift 4 代码:对于没有节标题的表格视图,您可以添加以下代码:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

你会得到标题间距为0。

如果您想要特定高度的标题,请传递该值:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

以及来自 viewForHeaderinSection 委托的视图。

于 2018-02-27T01:45:22.963 回答
8

唯一对我有用的是:

斯威夫特

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

目标-C

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

此外,我还有第一部分的额外空间。那是因为我tableHeaderView错误地使用了该属性。通过添加以下内容也修复了该问题:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
于 2016-12-30T11:31:48.540 回答
7

我有与 arielyz 相同的修复方法。一旦我将 UITableView 移动为不是父视图的第一个子视图,它就消失了。我的空间是 20 像素,而不是 35。

我无法在纵向 xib 中重新创建它,只能在横向 xib 中重新创建它。如果我可以在一个简单的演示应用程序中重现它,我稍后会提交一个雷达错误。

于 2014-04-11T07:20:25.630 回答
7

我认为制作 UIEdgeInsets -35 0 0 0 很乏味。就我而言,我实现了 tableView: heightForHeaderInSection: 方法,它有可能返回 0。

当我将 0 更改为 0.1f 时,问题就消失了。

于 2014-08-02T23:45:36.327 回答
6

我刚刚从中删除再次创建它,奇怪的 35px 消失了。UITableViewInterface Builder

似乎它有一个奇怪的错误Interface Builder

于 2014-10-20T13:37:59.300 回答
6

我们对此有多个答案。

1)您可以在视图 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)];
于 2017-04-15T12:19:17.360 回答
6

使用这个我认为这有帮助...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }
于 2015-10-26T11:57:45.623 回答
6

2019年回答:

你只要这样做

tableView.contentInsetAdjustmentBehavior = .never

奇异微妙的gotchya ->

这些天,Tableviews 有一个非常奇怪的行为:

  1. 在带有缺口(XR 等)的设备上,它不会告诉您添加更多插图,但前提是表格从屏幕的物理顶部开始。

  2. 如果你不是从屏幕顶部开始,它不会那样做,但是

  3. 这两种情况都是 >> 不相关的 << to safeAreaInsets....... 这很令人困惑

所有这些都是完全没有记录的......你可以浪费几个小时来弄清楚这一点。

如果您确实需要从屏幕/表格顶部实际开始测量,

实际上只是去:

tableView.contentInsetAdjustmentBehavior = .never

一个很好的例子显然是当您在表格顶部添加某种横幅或类似的东西时,这在当今很常见,您只需将表格的顶部插图设置为您的横幅/等在运行时变为的任何高度。

为此,您必须使用

tableView.contentInsetAdjustmentBehavior = .never

称呼 :/

奖金gotchya

不要忘记,这些天几乎总是在动态加载一些信息(用户图片、描述等),因此在信息到达之前,您无法将这些值设置为最终需要的值。另一个问题。:/

所以你会有这样的代码:

func setTableOffsetOnceFlagAreaSizeIsKnown() {
    tableView.contentInset.top = yourSpecialFlagViewUpTop.bounds.height
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    setTableOffsetOnceFlagAreaSizeIsKnown()
}
于 2019-10-08T19:32:03.800 回答
6
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return CGFLOAT_MIN;
}

这就是所有的人!

于 2016-05-09T16:45:33.170 回答
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
于 2016-04-15T08:18:29.860 回答
5

斯威夫特 4 答案...

如果在界面生成器中选择了表格视图并且在属性检查器中选择了样式“分组”,请在视图控制器中输入以下代码以修复额外的标题空间问题。

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
于 2019-07-10T20:36:49.387 回答
4

我也一直在用头撞这个。很确定这是一个iOS7错误。最终帮助我的是xib中的视图顺序。我有一个视图在其中正确显示了表格视图,而在另一个视图中,表格视图具有额外的 35 像素空间。然后(UITableView 明智)之间的唯一区别是,在显示不良的视图中,UITableView 是第一个孩子,而在正确显示的视图中,它是第二个。

这对我有用,只是改变了视图的顺序。我真的不想为解决方法添加额外的代码行......

于 2013-10-27T10:31:08.487 回答
4

只需将您的表格视图(或使其开始)固定在视图的绝对顶部。额外的多余空间正好是导航栏的高度。

于 2015-01-24T14:19:06.583 回答
4

当您使用 UITableView.Style.grouped 或 UITableView.Style.InsetGrouped 时,如果没有“tableview header”,tableview 将自动向“section header”添加顶部插入填充,修复很简单:

 self.tableview.tableFooterView = UIView(frame: CGRect.init(origin: .zero, size: CGSize.init(width: tableview.frame.size.width, height: 1)))
 self.tableview.tableHeaderView = UIView(frame: CGRect.init(origin: .zero, size: CGSize.init(width: tableview.frame.size.width, height: 1)))

如果您使用的是 UITableView.Style.Plain

self.tableview.contentInsetAdjustmentBehavior = .never

一般就足够了

于 2020-03-23T04:19:45.340 回答
4

斯威夫特3

如果您使用的是分组表,请执行以下操作。这将删除顶部空间。

    var frame = CGRect.zero
    frame.size.height = .leastNormalMagnitude
    self.tableView.tableHeaderView = UIView(frame: frame)
    self.tableView.tableFooterView = UIView(frame: frame)

如果您仍然遇到此问题,则默认情况下它将从顶部删除内容偏移量。

[设置内容插图从不]
https://i.stack.imgur.com/fjxOV.png

于 2019-03-25T12:56:10.730 回答
4

当你需要隐藏你的 tableHeaderView 时,你应该使用这个 Swift 3 代码:

tableView.tableHeaderView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0.0, height: CGFloat.leastNormalMagnitude)))
于 2018-05-07T12:38:35.757 回答
4
tableView.contentInsetAdjustmentBehavior = .never

在带有标题的普通表格视图上对我来说是解决方案(iOS12 / xcode 10)

于 2018-09-21T09:24:10.123 回答
4

self.automaticallyAdjustsScrollViewInsets = NO;

这在 iOS 11 中已被弃用,因此您应该 contentInsetAdjustmentBehavior在代码中使用新属性,它应该可以解决问题。

if #available(iOS 11.0, *) {
    collectionView.contentInsetAdjustmentBehavior = .never
}

UIScrollView 上有一个名为 contentInsetAdjustmentBehavior 的新属性在 iOS 11 中添加,用于确定调整内容偏移量

于 2018-10-12T07:56:07.733 回答
3

执行以下操作(Swift)可以解决问题,但是当您不需要标头时可以使用。

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.min
}

如果这样做,您将不得不放弃第一部分并使用其他部分作为内容。

UITableViewDataSource执行:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return <number_of_data_sections>+1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // the first section we don't use for data
    if section == 0 {
        return 0
    }

    // starting from 1, there are sections we use
    if section == 1 { 
        let dataSection = section - 1

        // use dataSection for your content (useful, when data provided by fetched result controller). For example:
       if let sectionInfo = myFRC!.sections![dataSection] as? NSFetchedResultsSectionInfo {
            return sectionInfo.numberOfObjects
        }
    }

    return 0
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let dataIndexPath = NSIndexPath(forRow: indexPath.row, inSection: (indexPath.section - 1) )
    // return cell using transformed dataIndexPath
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 1 {
        // return your header height
    }
    return CGFloat.min
}


func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 1 {
        // return your header view
    }
    return nil
}

func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    // in my case, even when 1st section header was of zero heigh, I saw the space, an that was a footer. I did not need footer at all, so always gave zero height
    return CGFloat.min
}

就是这样。模型对更改一无所知,因为我们在访问数据时会转换节号。

于 2015-09-17T01:11:08.757 回答
3

如果选择UITableViewStyleGrouped的样式,需要实现HeaderFooter高度委托方法,返回值需要大于0;像这样:

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

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return CGFLOAT_MIN;
}
于 2017-09-21T12:37:57.087 回答
2

对我来说,我尝试了所有解决方案,但我想为 UITableView 部分设置高度,它对我有用。(使用swift

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0.001
    }
于 2019-04-30T08:28:11.533 回答
2

带故事板:

确保您的 UITableView 顶部约束没有说“在顶部布局指南下”。相反,它应该说“顶部空间:Superview”(Superview.Top)。

当然,在包含 UITableView 的 UIViewController 中取消选中“调整滚动视图插图”。

于 2016-04-12T10:06:52.100 回答
2

根据苹果文档

将视图分配给此属性时,将该视图的高度设置为非零值。表格视图只考虑视图框架矩形的高度;它会自动调整标题视图的宽度以匹配表格视图的宽度。

斯威夫特 5

如果你有一个UITableView你想要的分组tableHeaderView

在将视图分配给 之前tableView.tableHeaderView,将该视图的高度设置为非零值,例如:

// Set the initial height of your custom view to the smallest value  
myTableHeaderView.frame.size.height = .leastNonzeroMagnitude

// Assign your custom view to the header view
tableView.tableHeaderView = myTableHeaderView

// Set width constraint, height should grow based on your view. 
tableView.tableHeaderView!.widthAnchor.constraint(equalTo: tableView.widthAnchor).isActive = true

无需使用contentInsets或处理委托方法的魔法。

于 2019-09-23T09:08:10.117 回答
2

我有一个 VC,里面有一个 Container(顺便说一句,它是 Nav 控制器的一部分),其中嵌入了一个 TableVC。

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

  • 取消选中自动调整滚动插图
  • 取消选中顶部栏下的延伸边缘

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

容器 View.top = ParentView.Top 边距

这为我完成了以下任务:

  • 将桌子拉到顶部,但就在我的导航栏下方
  • 刷新后,表格返回到这个位置,而不是像以前那样在导航栏上方+下方
  • 滚动表格在实际底部触底后,不短

这个设置对我来说有很多试验和错误,但我最终发现了这些小细节 lekksi @Remove empty space before cells in UITableView

于 2016-05-16T21:10:23.703 回答
2

我遇到了这个确切的问题,但是在 tableView 单元格中有一个 tableView。从上面的众多答案中没有任何效果。一件非常奇怪和简单的事情奏效了:

- 在为 tableView 分配代表之前放置估计的高度!

    override func awakeFromNib() {
        super.awakeFromNib()

        tableView.estimatedRowHeight = 58
        tableView.estimatedSectionHeaderHeight = 45
        tableView.estimatedSectionFooterHeight = 10
        tableView.dataSource = self
        tableView.delegate = self
    }

将估计值放在委托分配之后,导致我的内部 tableView 在标题上方有一个奇怪的空白。我希望它可以帮助这里的人。

于 2020-03-31T09:22:50.540 回答
2
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNonzeroMagnitude
}
于 2020-09-09T21:51:05.907 回答
2

如果我添加一个高度非常小的 tableHeaderView,它可以解决问题

    let v = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.000000001))
    tableViewDocuments.tableHeaderView = v
于 2019-09-17T14:49:06.553 回答
1

我注意到这个问题有很多答案取决于你想要做什么,所以我会分享我的,以防有人想要同样的效果:

在此处输入图像描述

在我的视图控制器中,我有一个由 200 点高UITableView的分组和一个包含广告标题、价格、位置和发布时间的属性。下面是表格视图的内容。tableHeaderViewUIScrollViewUILabel

使用分组表视图标题的默认尺寸,“更多信息”标题远低于“5 天前”标签。我通过覆盖每个部分的页眉和页脚的高度来修复它(已经是上图)。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return section == kMoreInfoSection ? 33 : UITableViewAutomaticDimension;
}

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

我从@erurainon 在接受的答案中的评论和 https://stackoverflow.com/a/14404104/855680 中了解到如何UITableViewAutomaticDimension覆盖高度。不像公认的答案所暗示的那样,我不必在我的视图控制器self.automaticallyAdjustsScrollViewInsets中设置。NO

我也已经尝试过UIEdgeInsets为顶部设置并给表格视图一个负值,但它不起作用——整个表格视图向上移动,包括tableHeaderView.

于 2013-12-26T06:44:57.213 回答
1
set
  override func viewDidLoad() {
  self.tableView.delegate = self
  self.tableView.dataSource = self
}
于 2019-09-13T17:27:47.913 回答
1

请检查 tableview 是否分组/普通。就我而言,我已将样式更改为普通样式,并且效果很好。现在标题上方的额外间距已经消失了。

于 2019-11-18T08:03:16.767 回答
1

如果self.automaticallyAdjustsScrollViewInsets = NO;对您不起作用,请确保 tableview 标题或节标题的高度CGFLOAT_MIN不是0.

例如,如果你想让 tableview 标题 0 高,你可以这样做:

    CGRect frame = self.tableViewHeader.frame;
    frame.size.height = CGFLOAT_MIN; //not 0
    self.tableView.tableHeaderView.frame = frame;
    self.tableView.tableHeaderView = self.tableViewHeader;

希望能帮助到你。

于 2019-07-08T01:13:23.447 回答
1

2021 年 Xcode 12.3 更新

要解决此问题,需要禁用标准节页脚。以下代码片段完成了这项工作:

override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return nil
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 0
}

的使用

tableView.contentInsetAdjustmentBehavior = .never

在这里完全不相关

于 2021-01-06T08:52:46.187 回答
1
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 0.0
}

这对我有用。也可以根据部分给出标题的高度。

于 2019-01-09T10:09:35.160 回答
1

确保您已为表提供了约束。我没有遇到过类似的问题,即在表格底部有一个无法解释的填充。

于 2016-05-20T09:22:59.997 回答
1

我浏览了所有答案。没有一个对我有用。我所要做的就是:

self.myTableView.rowHeight = UITableViewAutomaticDimension
self.myTableView.estimatedRowHeight = 44.0

此外,该问题并未发生在 tableView 的顶部。它发生在tableView的每个部分的顶部。

FWIW 这个问题只发生在 iOS9 上。我们的应用在 iOS10 和 iOS 11 上运行良好。

我强烈建议您查看这个很棒的问题及其最佳答案:

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

于 2017-11-21T21:55:21.337 回答
1

只是取消选中Adjust Scroll View Insets对我不起作用。
后来,我尝试将tableview的header设置为nil,幸好奏效了。

self.tableView.tableHeaderView = nil
于 2019-12-23T10:43:00.820 回答
1

对于第一部分,我们需要这样设置tableHeaderView

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: .leastNonzeroMagnitude))

对于其他部分,我们应该heightForFooterInSection这样设置:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNonzeroMagnitude
}
于 2020-11-20T13:58:06.967 回答
1

没有任何答案或解决方法对我有帮助。大多数人都在处理 tableView 本身。对我来说导致问题的是我将 tableView 或 collectionView 添加到的视图。这就是为我解决的问题:

斯威夫特 5

edgesForExtendedLayout = []

我把它放在我的 viewDidLoad 中,恼人的差距就消失了。希望这可以帮助。

于 2019-07-20T15:49:07.783 回答
1

在我的情况下,Storyboard 中的原型可视化上有一个名为“HeaderView”的不需要的单元格,当我删除它时,一切都很好。

于 2017-04-06T14:16:21.363 回答
0

在 iOS 7 中,您查看启动屏幕而不是导航栏下方。将其设置为导航栏的底部非常简单。检查答案以获取解决方案,它不是同一个问题,但与您的问题非常相关。

于 2014-03-06T14:36:21.120 回答
0

以前的答案都不适合我。最终对我的情况起作用的(在动态添加标题到 my 后看到填充Table View)是Navigation Bar从中选择Document Outline并重新选中该Translucent框(与某些答案相反,说强制它是半透明的)。我之前没有选中它,因为它使我的红色看起来有点橙色,但我无法尝试重新排序场景中的元素的解决方案,因为它Table View是这个场景中唯一的元素。只要您对在Navigation Bar其上具有半透明层的 's 颜色感到满意,此解决方案就可以工作。希望这可以帮助 :)

于 2017-08-15T14:50:08.773 回答
0

使用 swift 4.1。尝试这个:

func tableView(_ tableView: UITableView, viewForHeaderInSection 
section: Int) -> UIView? {
    return nil 
}
于 2018-05-10T06:38:16.580 回答
0

我遇到了额外的顶部空间问题,我不得不考虑一堆答案才能找到解决方案。(5小时检查所有给出的答案)

首先,如果您担心

表格视图 - 模式为“组”,请将其更改为“普通”

无需对页眉或页脚部分进行任何更改,或添加与它们相关的其他委托方法

然后在InterfaceBuilder中拥有TableView的ViewController中-取消选中调整滚动视图插图-取消选中扩展边缘:在顶部栏下

*此外,请确保您正在删除派生数据并在模拟器或手机中重新安装您的应用程序,以有效反映所做的更改。

UI 更改有时不会反映,因为 IDE 也...在此处输入图像描述

于 2020-03-06T13:17:25.840 回答
0

我不确定这个答案是否很好,但它对我有用

我选择 Table View ,导航到标尺,将 Y 值更改为零

在此处输入图像描述

于 2016-04-07T16:53:15.017 回答
0

还有另一种方法......但我喜欢它,因为它避免硬编码任何高度值

UITableViewStyleGrouped表格(静态或动态)中,只需在tableView(_:heightForHeaderInSection). 我正在根据节标题标签的底部填充计算新高度。

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    var height = UITableViewAutomaticDimension

    if section == 0, let header = tableView.headerViewForSection(section) {
        if let label = header.textLabel {
            // get padding below label
            let bottomPadding = header.frame.height - label.frame.origin.y - label.frame.height
            // use it as top padding
            height = label.frame.height + (2 * bottomPadding)
        }
    }

    return height
}

在 iOS 9、Xcode 7.3 上测试。

希望能帮助到你。

于 2016-08-09T09:03:18.167 回答
0

在尝试了一切之后终于想出了如何解决这个问题!

我注意到由于某种原因,我的 tableview 的 contentOffset 的“y”为 -20,所以在配置我的 tableview 时:swift 3/4

tableView.contentOffset = .zero

Objective-C

self.tableView.contentOffset = CGPointMake(0, 44);
于 2018-02-13T05:41:18.767 回答
-1

投入十美分 - 从表格视图中删除标题单元格后,我遇到了同样的问题。为了解决这个问题,我将 Attributes Inspector 中的 TableView样式从“Grouped”更改为“Plain”,并移除了多余的空间。

于 2016-05-11T20:12:04.853 回答