为什么我的UITableView顶部有额外的填充样式UITableViewStyleGroued in iOS7

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

下面是一个例子:

输入图片描述

表格视图从第一个箭头开始,有35个像素的不明填充,然后绿色标题是viewForHeaderInSection返回的UIView(其中部分为0)。

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


更新(答案):

iOS11及以后:

tableView.contentInsetAdjustmentBehavior = .never
302384 次浏览

我假设这只是新的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];
}
}

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

self.edgesForExtendedLayout = UIRectEdgeNone;

你的问题和我的相似

更新时间:

9. xiOSSwift:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

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

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

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

这是个变通办法但很有效

我用它玩了一会儿,似乎这是设置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是乏味的。

在我的情况下,这对我有帮助。我也支持ios6。

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

我得到了以下帮助:

YouStoryboard.storyboard>YouViewController>属性检查器>取消选中-调整滚动视图内嵌。

在此处输入图像描述

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

从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];

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

self.tableView.delegate = self;

顶部没有空格。这就像tableView在某个地方缓存结果,而在设置委托并调用reloadData后不重新绘制本身。

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

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


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

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

Swift版本:

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


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

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

这对我来说很有用,只是改变了视图的顺序。我真的不喜欢为解决方法添加额外的代码行…

self.automaticallyAdjustsScrollViewInsets = NO;

试试看,你能应付的!

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

输入图片描述

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

使用分组表视图标题的默认尺寸,“更多信息”标题远低于“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.automaticallyAdjustsScrollViewInsetsNO,这与接受的答案建议的不同。

我还尝试过设置UIEdgeInsets并为表视图的顶部设置负值,但它不起作用-整个表视图向上移动,包括tableHeaderView

根据Apple的iOS7过渡指南,滚动视图的内容插图会自动调整。 自动调整滚动视图集的默认值设置为YES。

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

self.automaticallyAdjustsScrollViewInsets = NO;

这会起作用的。

编辑1:

另外,一个可以尝试-

self.navigationController.navigationBar.translucent = YES;

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

在iOS7中,您查看的开始是屏幕的一部分,而不是导航栏的下方。将其设置为导航栏的底部非常简单。检查这个的解决方案答案,这不是同一个问题,但与您的问题非常相关。

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

我无法在肖像xib中重现它,只有风景xib。如果我能在一个简单的演示应用程序中重现它,我将在稍后提交雷达bug。

在使用分组TableView时,使用此选项来避免在viewWill中切割边框

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

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

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

只需将以下内容添加到您的VC中的viewDi Load:

self.automaticallyAdjustsScrollViewInsets = NO;

我刚刚删除UITableViewInterface Builder再一次创造了它和奇怪的35px消失了。

似乎在Interface Builder中有一个奇怪的bug。

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

 self.automaticallyAdjustsScrollViewInsets = false

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

另一个快速评论……即使在XCode 6.1中,也有一个垂直空格出现在UIScrollViewsUITextViewsUITableViews顶部的bug。

输入图片描述

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

输入图片描述

(我感谢Oded向我指出这个方向……我发布这个评论,只是为了添加一些截图,演示症状和修复。

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

故事板:

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

输入图片描述

代码:

self.automaticallyAdjustsScrollViewInsets = false

上面的很多答案都太老套了。如果苹果决定修复这种意想不到的行为,它们将在未来的任何时候崩溃。

问题的根源:

  1. UITableView不喜欢具有高度为0.0的标头。如果您要做的是具有高度为0的标头,您可以跳转到解决方案。

  2. 即使稍后您为标头分配了非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;

下面的操作(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
}

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

使用这个我认为这个帮助…

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.005f;// set this according to that you want...
}

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

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

self.navigationController.navigationBar.translucent = YES;

框架将自动设置预计算内容


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

self.automaticallyAdjustsScrollViewInsets = NO;

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

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

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

我不确定这个好的答案,但它与我一起工作

我选择表格视图,导航到标尺,将Y值更改为零

在此处输入图片描述

故事板:

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

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

override func viewWillAppear(animated: Bool) {
self.edgesForExtendedLayout = UIRectEdge.None


//  OR


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


//OR


self.automaticallyAdjustsScrollViewInsets = false
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{


return CGFLOAT_MIN;
}

这就是所有的人!

把我的10美分扔进去-我从表视图中删除标题单元格后也遇到了同样的问题。为了解决这个问题,我将属性检查器中的TableView风格从“分组”更改为“普通”,并删除了额外的空间。

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

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

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

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

容器View.top=父视图

这为我实现了以下几点:

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

这个设置对我来说有很多尝试和错误,但我最终发现了lekksi@在UITableView中删除单元格前的空格发布的这些小细节

确保你已经给出了表格的约束条件,我以前没有这样做过,现在也面临着类似的问题,在表格的底部有一个无法解释的填充。

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

这个问题的原因:-

  1. UITableView不喜欢具有高度为0.0的标头。如果您要做的是具有高度为0的标头,您可以跳转到解决方案。
  2. 即使稍后您为标头分配了非0.0高度,UITableView也不喜欢首先分配高度为0.0的标头。

在视图中:-

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
}

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

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

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

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
}

在iOS9,Xcode 7.3上测试。

希望有帮助。

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

在此处输入图像描述

唯一对我有用的是:

Swift

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Objective-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 3的iOS10的解决方案:

您可以通过从UITableViewDelegate中实现以下方法来摆脱顶部和底部填充。

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


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

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

对此我们有多种答案。

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

前面的答案都不适合我。最终适合我的情况(在动态向我的Table View添加标头后看到填充)的是从Document Outline中选择Navigation Bar并重新检查Translucent框(与一些答案说要强制它为半透明的答案相反)。我之前取消了它,因为它让我的红色看起来有点橙色,但我无法尝试重新排序场景中元素的解决方案,因为Table View是该场景中的唯一元素。只要你不介意Navigation Bar的颜色上有一个半透明层,这个解决方案就有效。希望这对你有帮助:)

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

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


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

这就是通过Storyboard在iOS11xcode 9.1中轻松修复它的方式:

选择表格视图>尺寸检查器>内容插入:从不

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

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

此外,问题不是发生在tableView的顶部,而是发生在tableView的每个部分的顶部。

FWIW此问题仅发生在iOS9上。我们的应用程序在iOS10和iOS11上运行良好。

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

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

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

我注意到由于某种原因,我的tableview的ContentOffset的'y'为-20,因此在配置我的tableview时: Swift 3/4

tableView.contentOffset = .zero

Objective-c

self.tableView.contentOffset = CGPointMake(0, 44);

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
}

和来自viewForHeaderinSect委托的视图。

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

YouStoryboard.storyboard>YouViewController>选择TableView>大小检查器>内容插图-将其设置为从不。

在此处输入图片描述

当您需要隐藏tableHeaderView时,您应该使用以下Swift 3代码:

tableView.tableHeaderView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0.0, height: CGFloat.leastNormalMagnitude)))

使用Swift 4.1。试试这个:

func tableView(_ tableView: UITableView, viewForHeaderInSection
section: Int) -> UIView? {
return nil
}
tableView.contentInsetAdjustmentBehavior = .never

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

self.automaticallyAdjustsScrollViewInsets = NO;

这在iOS11中已弃用,因此您应该使用new属性 #代码中的EYZ0,它应该可以解决问题。

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

在UIScrollView上有一个新属性,名为ContentInsetAd的行为,在iOS11中添加以确定调整内容偏移量

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

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

Swift3

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

    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

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

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

这段代码对我有用,对我来说最好的答案是用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(),它就会像魅力一样工作。

对于iOS15+,上面的一个不会工作,所以用这个:-

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

对于iOS15+,如果您想为整个项目应用更改,请使用:-

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    

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

如果self.automaticallyAdjustsScrollViewInsets = NO;不适合您,请确保表视图标头或节标头的高度是CGFLOAT_MIN而不是0

例如,如果你想让表视图头0高,你可以这样做:

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

希望有帮助。

Swift 4答案…

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

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

没有一个答案或解决方法对我有帮助。大多数人都在处理tableView本身。对我来说,导致这个问题的是我添加tableView或集合视图的视图。这就是我修复它的原因:

SWIFT5

edgesForExtendedLayout = []

我把它放在我的视图中,烦人的差距消失了。希望这有帮助。

set
override func viewDidLoad() {
self.tableView.delegate = self
self.tableView.dataSource = self
}

如果我添加一个高度非常小的tableHeaderView,它会修复问题

    let v = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.000000001))
tableViewDocuments.tableHeaderView = v

根据苹果留档

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

Swift5

如果你有一个分组的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答案:

你只要做这个

tableView.contentInsetAdjustmentBehavior = .never

奇异微妙的陷阱->

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

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

  2. 如果你在屏幕顶部启动Not,它不会这样做,但是

  3. 这两种情况都>>无关<<safeAreaInsets……这非常令人困惑

所有这些都是完全没有证件……你可以浪费几个小时来解决这个问题。

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

事实上,只要去:

tableView.contentInsetAdjustmentBehavior = .never

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

要做到这一点,你必须使用

tableView.contentInsetAdjustmentBehavior = .never

调用:/

奖金到手了

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

所以你会有这样的代码:

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


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

请检查表视图是否是分组/普通的。在我的情况下,我已经将样式更改为普通并且它起作用了。现在标题上方的额外行间距已经消失了。

只是取消选中Adjust Scroll View Insets对我不起作用。
后来,我尝试将tableview的标题设置为nil,幸运的是,它起作用了。

self.tableView.tableHeaderView = nil

我面临着额外的顶部空间问题,我必须找到一堆答案才能找到解决方案。(5小时检查所有给出的答案)

第一个如果你关心的

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

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

然后在InterfaceBuilder中具有TableView的ViewController中 -取消选中调整滚动视图插入 -取消选中扩展边缘:在顶部酒吧

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

UI更改有时不会反映,因为IDE也…输入图片描述

当你使用UITableView.Style.grouped或UITableView. Style. InsetGroued时,如果没有“tableview头”,tableview会自动将顶部插入填充添加到“节头”,修复很简单:

 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

一般来说就足够了

我有这个确切的问题,但在tableView单元格中使用tableView。 从上面的众多答案中没有任何作用。 一个非常奇怪和简单的工作:

-在为表格分配委托之前放置估计的高度View!!

    override func awakeFromNib() {
super.awakeFromNib()


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

将估计值放在委托分配之后,导致我的内部tableView在标题上方有一个奇怪的空白。 希望对大家有所帮助

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

对于第一部分,我们需要像这样设置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
}

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

在这里完全无关

iOS15:

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

固定:在整个项目中固定:

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

更多详情:iOS15中表格视图标题上方的额外填充

注意:此仅适用于UITableView.Style.plain

如果您使用snapkit,则代码在这里。


self.tableView.snp.makeConstraints { make in
make.top.equalToSuperview().inset(-35)
make.leading.trailing.equalToSuperview().inset(0)
make.bottom.equalTo(self.view.safeAreaLayoutGuide)
}


在XCode 13.2.1和Swift 5.0上

对于iOS15,请尝试viewDidLoad中的以下解决方案:

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

如果您在iOS15或更高版本中遇到此问题,请执行以下操作:

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

输入图片描述

content Insets设置为Never为我解决了问题。

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

把这个代码,它会工作

iOS15+:

tableView.tableHeaderView = .init(frame: .init(x: 0, y: 0, width: 0, height: CGFloat.leastNonzeroMagnitude))

参考:https://medium.com/@GalvinLi/fix-the-table-head er-gap-in-ios-15-197Debb92608