176

我目前正在尝试将 aUITableView放在不同的位置,而不是放在我的视图控制器的顶部。话虽如此,它正在尝试在顶部添加标题以说明导航栏,但这不是必需的,因为我的控制器顶部没有。

如果我将单元格放在我想要的位置的左上角UITableView,它不会将单元格放在那里:

现在,如果我只是向上移动表格视图以便单元格位于正确的位置,我会遇到一个不同的问题 - 滚动时单元格可以向上移动到那里(这是用我的手指在导航控制器上方):

当我放手时,是的 - 单元格将位于搜索栏的正下方,但这显然是一个问题,您如何将它们带到它上方。

我该怎么做呢?有没有更简单的方法?

4

32 回答 32

379

UITableView向下滚动时是否会在空白处显示单元格?

如果是这样,那么问题可能是UITableView由于您在视图中具有导航控制器而添加到的插图。插图被添加到表格视图中,以便在未发生滚动时将内容放置在导航栏下方。滚动表格时,内容会滚动并显示在透明导航栏下。当然,只有当表格视图直接在导航栏下方开始时才需要这种行为,这里不是这种情况。

另一件需要注意的事情是,iOS 只为视图层次结构中的第一个视图调整内容插入,如果它是UIScrollView或者它的后代(例如UITableViewUICollectionView)。如果您的视图层次结构包含多个滚动视图,automaticallyAdjustsScrollViewInsets则只会对第一个进行调整。

以下是更改此行为的方法:

a) 界面生成器

  • 选择视图控制器
  • 打开属性检查器
  • 在 IB 的属性检查器(选择视图控制器时)中有一个名为“调整滚动视图插图”的属性,默认情况下是打开的。取消选中此选项:


    (图片由Dheeraj D提供)

我不确定哪个 Xcode 版本引入了这个选项(在发行说明中没有发现它),但它至少在 5.1.1 版本中可用。

编辑:为避免混淆,这是评论中提到的第三个选项

b) 以编程方式

将此添加到 ie viewDidLoad(归功于Slavco Petkovski的回答和Cris R的评论)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c)这可能与老学生有关

您可以通过添加来解决此问题

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

或者,如果您使用的是 IB,并且导航栏不透明(从屏幕截图中看不出来)

  • 选择视图控制器
  • 打开属性检查器
  • 在 View Controller options Extend Edges 部分取消选择“Under Top Bars”
于 2013-10-30T08:11:01.897 回答
72

我遇到了同样的问题,我很确定我曾经在那里有一个 UIView。只需复制整个表格视图,将其删除,然后再次粘贴即可为我修复它。

于 2013-10-11T16:14:32.180 回答
46

在情节提要中选择 tableview 并确保将样式设置为“Plain”,而不是“Grouped”。您可以在属性检查器选项卡中找到此设置。

于 2013-10-10T12:58:43.867 回答
9

在我的情况下,我在视图层次结构中的 UITableView 下有一个 UILabel。

我将它“向前”移动,出现了空白。不知道为什么,但它是这样工作的,如果 tableView 下有任何东西,它会隐藏空白区域。

您也可以尝试在情节提要上的视图控制器检查器上检查/取消“调整滚动视图插图”。

在此处输入图像描述

于 2014-08-04T15:20:29.417 回答
9

以上都没有帮助我。但这样做确实有帮助

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

而不是-64您可以根据导航栏的高度放置任何其他数字。

于 2016-10-16T12:38:11.943 回答
5

有可能是预先添加的UIRefreshControl。我对这样的代码有这个问题:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

如您所见,我self.refreshController在之后立即设置init

但是,如果您在设置refreshControl后设置,则顶部空间不会干扰您。

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}
于 2014-04-27T16:27:48.390 回答
5

如果您在 iOS 11 上执行此操作,那么 automaticAdjustsScrollViewInsets 将无法正常工作,因为它已被弃用,根据这篇文章中的答案,以下代码对我有用:https ://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

希望这可以帮助。

于 2017-11-27T17:57:21.667 回答
5

斯威夫特 5

尝试删除tableHeaderViewtableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)
于 2019-08-02T09:38:25.763 回答
4

在 Storyboard 中,将contentInsets你的设置tableviewNever

在此处输入图像描述

于 2018-08-16T09:22:24.530 回答
3

我不能肯定地说,但看起来你有一个额外的 UIView 卡在原型单元开始的位置和 UITableView 的顶部之间。如果您删除我添加的文本/行,我的图像看起来与您的完全一样。

在此处输入图像描述

于 2013-09-20T04:15:01.960 回答
3

我仍然不确定是什么导致了顶部的额外空间,但我发现删除带有空间的 UITableView 并用新的替换它会占用空间。

我一定是不小心把 UIView 拖到了那里,但我无法选择它,所以我无法删除。

于 2013-09-21T14:11:50.030 回答
3

在我的应用程序中,我也遇到过这样的问题。我已将 tableView 的顶部边缘插图设置为零。还尝试设置falseautomaticallyAdjustsScrollViewInsets. 但是没有用。

最后我得到了一个可行的解决方案。我不知道这是正确的方法。但是实现heightForHeaderInSection委托方法对我有用。您必须返回一个非零值才能执行此操作(返回零将显示与以前相同的空间)。

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

    return 0.1
}
于 2017-06-22T22:29:46.393 回答
3

如果您使用的是 iOS 15 或更高版本,此解决方案挽救了我的生命:

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

所有学分: https ://stackoverflow.com/a/69192511/1158074

于 2021-12-02T09:04:44.583 回答
2

在情节提要或 xib 中检查您的 tableview 框架。默认情况下,我的位置值是y,因此存在错误

于 2016-04-27T00:23:53.503 回答
2

2017年,对我有用的就是这一行

navigationController?.navigationBar.isTranslucent = false

我不知道为什么这会影响它。也许有人可以解释。但我很确定这是大多数人会寻找的答案。

于 2017-08-16T19:22:05.287 回答
2

在 iOS 11 及更高版本中,苹果更改了属性以调整内容插入。使用contentInsetAdjustmentBehaviorand set.never删除UICollectionView, UIScrollView, . 上方的多余空格UITableView

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

我希望这能帮到您。

于 2019-03-07T06:17:55.587 回答
1

对我来说,当我将原型单元格从菜单拖到表格视图中时,问题就出现了。所以我删除了它,只是在表格视图检查器属性中将原型单元格设置为 1

于 2014-03-30T05:33:28.383 回答
1

只要 UITableView 不是视图控制器的第一个子视图,空白空间就不会出现。

解决方案:添加一个隐藏/清除视图对象(视图、标签、按钮等)作为视图控制器的第一个子视图(与 UITableView 处于同一级别但在它之前)。

于 2014-10-19T15:30:24.390 回答
1

我正在以编程方式执行此操作,在添加所有其他子视图后,我只是将 addSubview(tableView) 移动到底部,它解决了我的问题!

不知道为什么这只出现在设备上而不是我的模拟器上,但不管怎样,至少有一个简单的解决方案!

于 2017-08-14T13:35:02.820 回答
0

就我而言,我使用的是容器视图。(主视图->容器视图-> UITableView)

我认为顶部的额外空间就像设备通知栏的空间(显示时间的地方,电池)。我是真的,这不是假设。

我所做的是来自 UI Builder:

  • 选择 Table View Controller 完成
  • 打开属性检查器
  • 转到 -> 视图控制器 -> 布局 -> “选择想要全屏”
于 2013-11-22T20:13:18.237 回答
0

您可以将此代码用于创建表的 viewDidLoad 或 viewDidAppear 中:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];
于 2013-11-25T12:31:29.793 回答
0

UIView 可以插入到表格的顶部和底部(拖放)。将它们的属性设置为透明和 1 px 的高度。这是为了删除单元格前面的额外填充。

于 2014-05-22T11:32:56.993 回答
0

我也有这个问题 tableView 不是层次结构中的最后一个视图。在我的情况下,我在上面有一个视图(即使它们没有相互重叠),所以我将它拖到层次结构中的 tableView 上方并成功了。

于 2014-10-04T12:44:26.307 回答
0

我刚刚找到了解决方案。

只需选择 tableview 和 clic Editor -> Arrange -> Send to Front

它对我有用,希望对大家有所帮助。

于 2015-05-14T19:24:22.387 回答
0

就我而言,我使用的是 ContainerViewController 并将 UITableViewController 放入其中。删除 ContainerViewController 后。问题消失了。

于 2016-07-29T05:52:48.997 回答
0

Xcode 8 错误...</p>

如果您的 Storyboard UITableView 样式设置为普通,请先尝试此操作。

将表格的样式设置为 Grouped,然后再设置为 Plain。这删除了我的应用程序中 UITableView 头部的空间。

于 2016-11-07T15:32:54.537 回答
0

I just found a solution for this. In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away. https://i.stack.imgur.com/vRNfV.png

于 2017-09-13T09:48:30.363 回答
0

在情节提要中设置 ViewController 的 Extended Edges,以便underTopBar取消选中该属性。

于 2019-04-01T12:23:21.163 回答
0

有同样的问题。我通过将以下内容添加到 viewDidLoad 来解决它。

self.extendedLayoutIncludesOpaqueBars = true
于 2019-05-07T21:46:12.650 回答
0

回答最新:XCode 12.5.1;IOS 14

分组表视图的默认行为是在开头有那种空标题。

如果您不想拥有该空间,一般建议是使用.plain表格视图。

如果由于某种原因不能,则必须将标题设置为高度不为零的视图,如下例所示:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0,
                                                      width: self.tableView.bounds.size.width,
                                                      height: .leastNonzeroMagnitude))
于 2021-08-23T11:28:39.053 回答
-1

将内容插入设置为零:

于 2018-02-09T06:40:43.897 回答
-2

检查

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • 提到 tableview 委托函数cellForRowAtIndexPath:
  • 它可以同时处理 ios 6 和 7。
于 2014-08-12T12:18:42.657 回答