ChatGPT解决这个技术问题 Extra ChatGPT

为什么在 iOS7 中我的 UITableView 顶部有额外的填充,样式为 UITableViewStyleGrouped

从 iOS7 开始,我的 UITableView 顶部有额外的空间,其样式为 UITableViewStyleGrouped

这是一个例子:

https://i.stack.imgur.com/yNYTL.png

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

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

更新(答案):

在 iOS 11 及更高版本中:

tableView.contentInsetAdjustmentBehavior = .never
您使用的是最新的 iOS 7 吗?在后来的开发预览中,其中一些类型的不一致(但不是全部,也许不是这一种)已得到解决。我应该知道:我拖延了这么多一些问题消失了。
在此处查看答案 - stackoverflow.com/a/18986158/1463604
简短的回答是这个额外的填充可能是由于表格视图标题(而不是部分标题),并且 UITableView 不喜欢被分配高度为 0.0 的标题。查看 stackoverflow.com/a/31223403/1394534 了解更多详情。
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)]; 注意:如果您在矩形的高度中使用 0.0f,它只会被忽略。所以我们尽可能使用最接近零的 CGFloat (至少这对我来说“有效”......只是不是理想的解决方案)。
@AlejandroIván 你的评论让我度过了一个愉快的夜晚。我有一个带有分组原型的 tableView。我正在使用 numberSections = data.count 并设置 numberRows = 1。我设置了一个 heightForFooterInSection 以在每个之间留出一个干净的空间,并且由于某种原因出现了一个空白 tableHeaderView。

A
Alexander

我得到了以下帮助:

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

https://i.stack.imgur.com/CUVgX.png


我认为这是删除填充的正确方法,而不是篡改 edgeInset 值。
这对我不起作用——我上面有一个不透明的导航栏,关闭它会将内容推送到它下面。
使用自定义 collectionview 时不起作用。 (当 tableview 在 collectionviewcell 内时)
不适合我;唯一有效的是切换到普通而不是分组
我在容器视图中的 TableViewController 遇到了这个问题。我必须不直接在嵌入的 TableViewController 上设置此属性,而是在包含容器视图的视图控制器上设置。然后它起作用了。
M
Mr. T

我又玩了一会儿,似乎这是设置 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。每次重新计算 contentInset.top 时都必须记住删除额外的 35px 是很乏味的。


很好的解决方案!实际上,您必须将其设置为 0.01f 才能摆脱代码中的默认表格视图标题视图。
顺便说一句,这也可以通过 Interface Builder 中的一次拖放来完成。总之感谢! :)
你先生应该为此获得一枚奖章
请记住,表格视图顶部的 0.01f 高度视图将意味着下方的所有单元格都未对齐(第一个单元格的 Y 原点为 0.01,下一个单元格为 cell_height+0.01 等),因此这些单元格的内容会错位。 (在模拟器中打开 Debug > Color Misaligned Images 以亲自查看。)您不想这样做。
最好使用 UITableViewHeaderFooterView 而不是 UIView。 CGFLOAT_MIN 的工作原理与 0.01f 相同,但理论上更好。
Y
YannSteph

尝试更改 UITableViewUIScrollView 继承的 contentInset 属性。

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

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


contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0); 最适合我,因为顶部和底部有 20 个额外像素。
尽管这种“蛮力”解决方案有效,但我认为底部的解决方案(特别是自动调整的插图)应该排名更高。
完全破解,但 iOS 是垃圾,所以你能做什么。
B
Beslan Tularov

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

self.edgesForExtendedLayout = UIRectEdgeNone;

你的问题似乎和我的相似

更新:

iOS 9.x 中的 Swift:

self.edgesForExtendedLayout = UIRectEdge.None

斯威夫特 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

在我的普通 UITableView 上工作。问题源于我的 UITableView 位于 UINavigationController 内的 UIViewController 上,这导致表格内容下降 44 点,因此初始内容不在 navBar 后面。不过,我的布局不需要这样做,所以它只是引起了问题。最终,我将代码更改为 automaticallyAdjustsScrollViewInsets,它也可以正常工作。
此属性仅适用于嵌入在 UINavigationController 等容器中的视图控制器。窗口的根视图控制器不会对此属性作出反应。此属性的默认值为 all。 ..我觉得默认应该是0?这哪里有优势。
使用 Swift 3 更优雅:edgesForExtendedLayout = []
你好@yeahdixon 你用什么软件来制作粉色箭头?提前致谢
p
pkamb
self.automaticallyAdjustsScrollViewInsets = NO;

试试看,你可以应对的!


这非常适合在 iOS 7.0 中隐藏 tableHeaderView,但在旧版本中不支持。
在 iOS 7 下运行良好。
重要提示:确保在容器视图控制器中执行此操作,如果您的 UITableView 放置在一个控制器上,然后嵌入到另一个控制器中,请在嵌入顶部控制器中执行此操作,而不是直接放置 UITableView 的那个(其中 AutoLayout 将照顾事情)。
这比 uncheck Adjust scroll view insets 好。因为有时我们不使用故事板来构建我们的 UI。
这在 iOS 11.0 中已被弃用。 Xcode 会就此发出警告。在您不希望自动调整插入的滚动视图上使用它:self.tableView.contentInsetAdjustmentBehavior = .never
S
Suraj Mirajkar

您可以检测您的应用程序是否运行 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
}

这对我有用。 UITableView 在顶部添加空间有很多不同的原因。具体来说,与 OP 相关,该问题仅发生在分组样式表视图中。这个解决方案解决了这个问题。
您可以使用 CGFLOAT_MIN 而不是 0.001,它会为您提供 CGFloat 的最小绝对值。
这是正确的答案,因为真正的特征是填充仅存在于分组样式表视图中,如果您指定页眉/页脚,则会被忽略
这应该被标记为正确答案。一个要覆盖的委托方法,它回答了这个问题。如果您阅读了所有技巧,请至少先尝试一下。尝试发推文:-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { //return CGFLOAT_MIN;返回 30.0f; }
好的!作为奖励,如果您希望顶部有一个小标题并在分组部分之间添加更多标题,您可以使用以下内容:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
e
esilver

我找到了原始错误的原因并创建了一个示例项目来展示它。我相信有一个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 后不重绘自身。


我要补充一点,即使有委托但委托的 tableView:heightForHeaderInSection:tableView:heightForFooterInSection: 返回 0 你也会遇到这个问题。实现上面的协议方法并返回 0.01f 为我修复了它。
是的!!我尝试了 3 种所谓的解决方案,这就是其中之一!太棒了,谢谢:D
完美的。任何人都报告了一个错误,因为我认为这不是预期的行为。
很棒的发现!这仍然在 ios 9 中发生(我们没有使用 XIB),但是在 init 上设置委托固定了间距(不在 loadView 或 viewDIdLoad 中)。谢谢!
设置标题的估计高度对我有帮助
D
Dani

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

https://i.stack.imgur.com/keeaD.png


我的另一个视图控制器需要这个选项,显然当我创建一个新的 VC 时,更改会延续。谢谢你!
是的!有效,只需将其设置在 ContainerView 中即可!
M
Mike Gledhill

另一个快速评论...即使在 XCode 6.1 中,也存在一个错误,即在 UIScrollViewsUITextViewsUITableViews 的顶部出现垂直空格。

https://i.stack.imgur.com/2JLvN.png

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

https://i.stack.imgur.com/qNA76.png

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


请注意,如果您将 UITextView 作为页面上的第一个子控件,则此错误 errrr 问题也会发生在 iOS 8 中......所以它不仅仅是一个 UITableView 问题。
在所有解决方案中,只有这个 hack 对我有用。一个奇怪的错误的奇怪修复。我在 UITableview 上遇到过这个问题。
100万谢谢!这是唯一对我有用的解决方案。
(18 个月后我很惊讶,读者仍在投票赞成这个答案。Apple 真的没有解决这个问题吗?!)
救了我一命!谢谢。你知道找到这个简单的小“修复”需要多长时间吗?呃。
L
Levan Karanadze

iOS 15 的解决方案:

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

在整个项目中修复:

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

更多详情:Extra padding above table view headers in iOS 15

注意:这个 only appliesUITableView.Style.plain


很好,谢谢!这里的其他答案都没有为我解决这个问题。
谢谢!!它运行良好。
这个。谢谢你。我用头撞墙了一会儿,试图弄清楚这一点。我将手机升级到 iOS 15,我的应用程序的任何新版本都表现出这种行为。但是,我在应用商店上的现有版本没有。再次感谢。
谢谢,你拯救了我的一天! :D
如果没有上下文类型,则无法解析对成员“sectionHeaderTopPadding”的引用
A
Aqib Mumtaz

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

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

尝试了所有其他的。这是一个有效的!谢谢
g
girish_vr

根据 Apple 的 transition guide for iOS7,滚动视图的内容插入会自动调整。 automaticallyAdjustsScrollViewInsets 的默认值设置为 YES。

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

self.automaticallyAdjustsScrollViewInsets = NO;

这会成功的。

编辑1:

另外,可以尝试 -

self.navigationController.navigationBar.translucent = YES;

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


很好的答案,除非它不能完全回答问题。 Esilver 谈到 35px 的间隙,但 iOS7 增加了额外的 20px 标题:等于状态栏高度。
荒谬的问题。感谢你的回答。
这是另一个问题的答案。
谢谢它对我有用,在我的特殊情况下,我在视图控制器中嵌入了一个 tableviewcontroller,并且通过在 viewcontroller 中设置自动调整滚动视图Insets = false,顶部间隙消失了
A
Aurelien Porte

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

问题的根源:

UITableView 不喜欢有高度为 0.0 的标题。如果你想要做的是有一个高度为 0 的标题,你可以跳转到解决方案。即使稍后您为标题分配了非 0.0 的高度,UITableView 也不喜欢最初分配高度为 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;

最后,我找到了有效的答案。谢谢。此外,我了解到 tableView.tableHeaderView 实际上是行内容上方的辅助视图。在你的答案出来之前,我一直对部分标题感到困惑。
在 Swift 3 中,CGFLOAT_MIN 已替换为 CGFloat.leastNormalMagnitude
B
Bartłomiej Semańczyk

故事板:

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

https://i.stack.imgur.com/J4C7u.png

代码:

self.automaticallyAdjustsScrollViewInsets = false

使用 xcode 7 我没有看到属性检查器 > 布局,我应该在哪里添加 self.automaticallyAdjustsScrollViewInsets = false
鉴于确实加载。
s
shim

这是使用 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
}

SO的第二页帮助了我....我不知道为什么,也许是因为AutomaticDimension,也许是因为VFL的约束,无论如何,谢谢! ozi bua ist brav! :D
这些是节的页眉和页脚。该问题与整个表格标题有关。此外,在这两种委托方法中都没有任何特定于 Swift3 或 iOS 10 的内容(它们一直存在)。
V
Vipul Kumar

这段代码对我有用,对我来说最好的答案是用 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
    }
}

为避免使用值,我建议使用“.leastNonzeroMagnitude”而不是 0.01;
s
sunshinejr

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

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

感谢。它帮助我!
拯救了我的一天,伙计。
j
judepereira

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

self.automaticallyAdjustsScrollViewInsets = NO;

此修复有效,我更喜欢使用幻数手动设置插图。谢谢!
L
Lukas

就我而言,这对我有帮助。我也支持ios6。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

不知道这是做什么的,但效果很好。你能解释一下吗?
@MattWolfe 我迷路了,找到了这个解决方案,也不确定为什么会这样。我的猜测是控制器决定 tableview 需要插入,因为状态栏(或在其他情况下是工具栏/标签栏)所以它会自动添加它。我真的在为一些新的 iOS7“功能”而苦苦挣扎。也许有人理解它,并对此有一个真实的解释?
花了最后 2 天将一个相对较小的应用程序移植到 iOS 7 并且仍然有小问题.. 我在 ios 7 中修复它,它在 6 中中断,反之亦然.. 让我发疯!
这是与 OP 不同的问题。即使这样,对于分组表视图,顶部也会添加一个额外的空间。
这似乎是关键线: self.automaticallyAdjustsScrollViewInsets = NO;只是设置删除了我拥有的额外空间。
S
Saeed Ir

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

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


为我工作:)
伟大的!谢谢 :)
这不是 ios 11 中的 automaticallyAdjustsScrollViewInsets
V
Vinod Joshi

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

 self.automaticallyAdjustsScrollViewInsets = false

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


A
Ashish Pisey

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

此问题的原因:-

UITableView 不喜欢有高度为 0.0 的标题。如果你想要做的是有一个高度为 0 的标题,你可以跳转到解决方案。即使稍后您为标题分配了非 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 
}

u
user832

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

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

https://i.stack.imgur.com/j9n14.png


this answer 相比,除了屏幕截图之外还有哪些其他信息?
我猜是一样的,我在寻找解决方案时没有找到那个答案。那我应该删除我的答案吗..?
如果您可以通过描述为什么 Content insets = Never 真正解决此问题(此选项如何工作?)来扩展您的答案,则不会。
当 content insets 设置为 never 时,tableView 不会在 textField 编辑时向上滚动。
K
Kevin

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

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

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

- (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];
    }
}

如果 iOS7 上的 UITableViews(更具体地说 UITableViewCellScrollView)教会了我们一件事,那就是让内置类的视图层次结构保持不变。
好点子。另一种选择是......继续为每个iOS进行黑客攻击;)
哎呀,是的。打算写那个警告但忘记了。
凯文 - 我认为你是对的,这是设计使然。似乎为 heightForHeaderInSection 返回 0 是删除此填充的最简单方法。出于某种原因,在那个特定的实例上它对我不起作用,但它确实适用于其他 UITableView。
这绝对是“设计”。如果您暂停执行并运行:po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription],您会看到表格标题、第一节标题或第一个单元格(取决于您使用的内容)自然会留下 35 像素的边框......嘘。
z
zvjerka24

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

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

self.navigationController.navigationBar.translucent = YES;

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

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

self.automaticallyAdjustsScrollViewInsets = NO;

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

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

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


救命稻草!谢谢你self.automaticallyAdjustsScrollViewInsets = false
D
Dani

唯一对我有用的是:

迅速:

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))

适用于 Swift 4.2。谢谢
尝试了此页面中的所有内容,适用于带有标题视图的 iOS13 分组表视图。 self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01)) 。解决了这个问题。
S
Sunil

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 委托的视图。


这不能回答问题。问题是关于额外间距的来源,而不是如何摆脱它。
奇怪的是,如果你在 heightForHeaderInsection 返回 0,你仍然会得到这个额外的空间。它与 CGFloat.leastNormalMagnitude (最小正数)完美配合
F
Fattie

2019年回答:

你只要这样做

tableView.contentInsetAdjustmentBehavior = .never

奇异微妙的gotchya ->

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

在带有缺口(XR 等)的设备上,它不会告诉您添加更多插图,但前提是表格从屏幕的物理顶部开始。如果你不是从屏幕顶部开始,它不会那样做,但是这两种情况都是 >> 不相关 << 到 safeAreaInsets ......这很令人困惑

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

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

实际上只是去:

tableView.contentInsetAdjustmentBehavior = .never

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

为此,您必须使用

tableView.contentInsetAdjustmentBehavior = .never

称呼 :/

奖金gotchya

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

所以你会有这样的代码:

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    setTableOffsetOnceFlagAreaSizeIsKnown()
}

O
Oded

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

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


遇到了同样的问题,无法通过更改 contentInset 来解决它,但这种方法有效,即使它很hacky。对于它的价值,使用可视化调试工具,我能够看到虽然 UITableView 具有正确的高度,但它内部的 UITableViewWrapper 却没有。
完美的。这为我修复了 XCode 6.1 中的错误。这个 StackOverflow 页面中的其他建议都没有任何区别。我在 UIView 中有一个 UITableView,它是第一个子视图。拖动它成为第二个子视图完美地修复了它。 (如果有人需要我,我会在酒吧。)
谢谢!如果您在容器中有一个表视图控制器,这也适用。移动容器使其不是父视图中的第一个容器,从而消除了表格视图顶部的间隙。
J
Jiangfan Du

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

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


如果可以的话,我会不止一次地赞成这个。一定是一个奇怪的自动布局故障或什么的......因为任何> 0的作品,我建议使用FLT_EPSILON或DBL_EPSILON而不是0.1,因为两者都代表较小的正值,例如1.0 + epsilon!= 1.0

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅