删除UITableView中的单元格之前的空白空间


172

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

如果我将UITableView单元格放置在想要放置单元格的位置的左上角,则不会在其中放置单元格:

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

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

我将如何去做?有没有更简单的方法?

Answers:


378

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,并且导航栏不是透明的(无法从屏幕截图中分辨出)

  • 选择视图控制器
  • 打开属性检查器
  • 在“视图控制器选项”的“扩展边缘”部分中,取消选择“顶部栏下方”

2
在UIView上取消选择“顶部栏下”对我来说很好。谢谢。
AndreasØverland2014年

我很生气,使用“启用页面调度”功能,并且滚动条仅按导航栏的高度而不是整个单元格移动。谢谢。
LordParsley 2014年

8
第三个选项:取消选择“调整滚动视图插图”-就像一个超级按钮。谢谢lekksi!
Stas Zhukovskiy 2014年

2
在Swift工作的“ pelos”中,self.automaticallyAdjustsScrollViewInsets = false!
Cris R

1
如果每次在新的表格控制器中重新使用表格时,都需要设置UIEdgeInsetsZero,否则每次出现空白都会变得越来越大。
malhal '16

71

我也遇到了同样的问题,我很确定自己在某一时刻有一个UIView。只需复制整个表视图,删除它,然后再次粘贴就可以为我修复它。


7
这真的很奇怪。这解决了问题。知道什么时候发生吗?
MiQUEL

我认为您可以按照13
netshark1000 2014年

有同样的问题。删除它并阅读对我也有用。
2014年

3
据我所知,只有当滚动视图是视图控制器视图层次结构中的第一个子级时,才会自动调整滚动视图的内容插入(如果自动为AdjustsScrollViewInsets = YES,默认情况下为YES)。我的猜测是该解决方案有效,因为复制粘贴表视图后,它不再是视图层次结构中的第一个视图。
lekksi 2014年

发生的事情是,当tableView是您添加到视图的第一件事时,系统认为它必须为导航留出空间。我的猜测是有些人先添加tableView,然后再添加headerView。在出现一些问题之后,他们然后删除tableView并再次添加它,然后发生的事情是headerView是层次结构中的第一件事,因此系统不再需要进行调整,问题得以解决。我知道,因为我只使用代码,所以在我的情况下,必须先添加标题,然后再添加表以对其进行修复。
路易斯·杰拉德

40

在情节提要中选择表格视图,并确保将样式设置为“普通”,而不是“分组”。您可以在属性“检查器”选项卡中找到此设置。


太棒了..这是对我来说很奇怪的解决方案。.我只是复制并粘贴了整个视图控制器,但是以某种方式,这个粘贴的视图控制器的tableView具有了怪异的偏移量。这个答案解决了我的问题
daisura99 '18

这解决了问题,但是现在标题部分的行为有所不同。任何人?
布鲁诺·穆尼兹

祝福你。无论您在这个世界上的任何地方。永远保佑你。
gabuchan

9

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

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

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

在此处输入图片说明


2
我有一个分组的UITableView并取消了“ Adjust Scroll View Insets”的工作。
马特

5

以上都不对我有帮助。但是这样做确实有帮助

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

您可以根据导航栏的高度输入其他任何数字(而不是“ -64”)。


4

可能有预添加的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;
}

我不敢相信这是实际的问题。对我来说,这仅是<= 9.3.5的问题。您如何看待这个问题?
警报器'18年



3

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

在此处输入图片说明


3

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

我一定是不小心将UIView拖到了那里,但是我无法选择它,因此无法删除。


3

斯威夫特5

尝试删除tableHeaderViewtableFooterView

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

2

在情节提要或Xib中检查表格框架。我的默认情况下具有ay position值,因此该错误


2

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

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

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

    return 0.1
}

2

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

navigationController?.navigationBar.isTranslucent = false

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


那对我也一样。谢谢!
scurioni

2

在iOS 11及更高版本中,Apple更改了属性以调整内容插图。使用contentInsetAdjustmentBehavior和设置.never,除去上面多余的空间UICollectionViewUIScrollViewUITableView

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
}

我希望这能帮到您。



1

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

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


1

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

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


我花了很多时间试图弄清楚这一点,在这里和其他帖子上尝试了许多建议。这是解决它的一个。谢谢!您能否解释原因,还是发布指向某些文档的链接?我只是在学习iOS开发,它与Android有很大不同!:)
马克

0

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


0

我也有这个问题,tableView不是层次结构中的最后一个视图。在我的情况下,我有一个上方的视图(即使它们彼此不重叠),因此我将其拖动到层次结构中的tableView上方,然后就可以了。



0

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


0

Xcode 8错误…

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

将表的样式设置为“分组”,然后返回到“普通”。这删除了我的应用程序中UITableView开头的空间。


0

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

我认为顶部的多余空间就像设备通知栏(显示时间,电池)的空间。我确实这样做,这不是一个假设。

我所做的是从UI Builder获得的:

  • 选择Table View Controller完成
  • 打开属性检查器
  • 转到->视图控制器->布局->“选择要全屏显示”

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


0

在情节提要中设置ViewController的扩展边缘,以便underTopBar取消选中属性。


0

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

self.extendedLayoutIncludesOpaqueBars = true


-2

检查

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • 提及tableview委托函数cellForRowAtIndexPath:
  • 它可以同时处理ios 6和ios 7。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.