【问题标题】:Why is there extra padding at the top of my UITableView with style UITableViewStyleGrouped in iOS7为什么我的 UITableView 顶部有额外的填充,样式为 iOS7 中的 UITableViewStyleGrouped
【发布时间】:2013-09-23 16:35:47
【问题描述】:

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

这是一个例子:

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。

标签: ios uitableview ios7


【解决方案1】:

我得到了以下帮助:

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

【讨论】:

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

我玩了更多,这似乎是设置 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 相同,但理论上更好。
【解决方案3】:

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

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

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

【讨论】:

  • contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0); 对我来说效果最好,因为顶部和底部有 20 个额外的像素。
  • 虽然这种“蛮力”解决方案有效,但我认为底部的(特别是自动调整的插图)应该排名更高。
  • 完全破解,但 iOS 是垃圾,所以你能做什么。
【解决方案4】:

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

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 你用什么软件来制作粉红色的箭头?提前致谢
【解决方案5】:
self.automaticallyAdjustsScrollViewInsets = NO;

试试看,你可以解决的!

【讨论】:

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

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

【讨论】:

  • 这对我有用。 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 }
【解决方案7】:

我找到了原始错误的原因并创建了一个示例项目来展示它。我相信有一个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 像素空间。如果第 27 行处于活动状态且第 24 行被注释掉,则

self.tableView.delegate = self;

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

【讨论】:

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

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

【讨论】:

  • 我的另一个 View Controller 需要这个选项,显然当我创建一个新的 VC 时,更改会延续。谢谢!
  • 是的!有效,只需在 ContainerView 中设置即可!
【解决方案9】:

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

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

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

【讨论】:

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

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

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

【讨论】:

  • 尝试了所有其他方法。这是一个有效的!谢谢
【解决方案11】:

根据 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,顶部间隙消失了
【解决方案12】:

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

问题根源:

  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;

【讨论】:

  • 最后,我找到了有效的答案。谢谢。此外,我了解到tableView.tableHeaderView 实际上是行内容上方的附属视图。在你的答案出来之前,我一直对部分标题感到困惑。
  • CGFLOAT_MIN 在 Swift 3 中已替换为 CGFloat.leastNormalMagnitude
【解决方案13】:

故事板:

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

代码:

self.automaticallyAdjustsScrollViewInsets = false

【讨论】:

  • 使用 xcode 7 我没有看到属性检查器 > 布局,我应该在哪里添加 self.automaticallyAdjustsScrollViewInsets = false
  • 在视图中确实加载了。
【解决方案14】:

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

【讨论】:

  • 完美,谢谢!这里的其他答案都没有为我解决这个问题。
  • 谢谢!!它运行良好。
  • 这个。谢谢你。我用头撞墙了一会儿,试图弄清楚这一点。我将手机升级到 iOS 15,我的应用程序的任何新版本都表现出这种行为。但是,我在应用商店上的现有版本没有。再次感谢。
  • 我知道这种感觉。这个标题填充让我发疯了:D
  • 谢谢,你拯救了我的一天! :D
【解决方案15】:

这是使用 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
  • 这些是 section 页眉和页脚。该问题与整个表格标题有关。此外,在这两种委托方法中都没有任何特定于 Swift3 或 iOS 10 的内容(它们一直存在)。
【解决方案16】:

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

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

【讨论】:

  • 谢谢。它对我有帮助!
  • 拯救了我的一天,伙计。
【解决方案17】:

这段代码对我有用,对我来说最好的答案是用 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;
【解决方案18】:

就我而言,这对我有帮助。我也支持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;只是设置删除了我拥有的额外空间。
【解决方案19】:

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

self.automaticallyAdjustsScrollViewInsets = NO;

【讨论】:

  • 此修复有效,我更喜欢使用幻数手动设置插图。谢谢!
【解决方案20】:

这是在 iOS 11Xcode 9.1 中通过 Storyboard 轻松修复的方法:

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

【讨论】:

  • 为我工作:)
  • 太棒了!谢谢:)
  • 这不是 ios 11 中的 automaticallyAdjustsScrollViewInsets
【解决方案21】:

Swift:iOS 我在滚动视图上有 tableview .. 当我在同一屏幕上单击“返回”时。滚动视图在顶部占用更多空间.. 解决这个问题我用过:

 self.automaticallyAdjustsScrollViewInsets = false

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

【讨论】:

    【解决方案22】:

    感谢@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 
    }
    

    【讨论】:

      【解决方案23】:

      我假设这只是新 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 进行黑客攻击;)
      • 哎呀,是的。打算写那个警告但忘记了。
      • Kevin - 我认为你是对的,这是设计使然。似乎为 heightForHeaderInSection 返回 0 是删除此填充的最简单方法。出于某种原因,在那个特定的实例上它对我不起作用,但它在其他 UITableViews 上起作用。
      • 这绝对是“设计使然”。如果您暂停执行并运行:po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription],您会看到表格标题、第一节标题或第一个单元格(取决于您使用的内容)自然会留下 35 像素的边框......嘘。
      【解决方案24】:

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

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

      self.navigationController.navigationBar.translucent = YES;
      

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


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

      self.automaticallyAdjustsScrollViewInsets = NO;
      

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

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

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

      【讨论】:

      • 救命稻草!谢谢self.automaticallyAdjustsScrollViewInsets = false
      【解决方案25】:

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

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

      【讨论】:

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

      唯一对我有用的是:

      斯威夫特

      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 4.2。谢谢
      • 尝试了此页面中的所有内容,适用于带有标题视图的 iOS13 分组表视图。 self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01)) 。解决了这个问题。
      【解决方案27】:

      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(最小正数)完美搭配
      【解决方案28】:

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

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

      【讨论】:

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

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

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

      【讨论】:

      • 如果可以的话,我会多次投票。一定是一个奇怪的自动布局故障或什么的......因为任何> 0的作品,我建议使用FLT_EPSILON或DBL_EPSILON而不是0.1,因为两者都代表较小的正值,例如1.0 + epsilon!= 1.0
      【解决方案30】:

      2019 年回答:

      你就这么做

      tableView.contentInsetAdjustmentBehavior = .never
      

      奇异微妙的gotchya ->

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

      1. 在带有凹槽(XR 等)的设备上,它会在不告诉您的情况下添加更多插图但仅在表格从屏幕的物理顶部开始。

      2. 如果您从屏幕顶部开始,它不会那个,但是

      3. 这两种情况都>>不相关safeAreaInsets .......这非常令人困惑

      所有这些都完全没有记录 ...您可能会浪费数小时来弄清楚这一点。

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

      其实只要去:

      tableView.contentInsetAdjustmentBehavior = .never
      

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

      为此,您必须使用

      tableView.contentInsetAdjustmentBehavior = .never
      

      打电话:/

      奖金gotchya

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

      所以你会有这样的代码:

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

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 2017-09-18
        • 2013-10-06
        相关资源
        最近更新 更多