在 UITableView 中删除单元格前的空白

我目前正在尝试把一个 UITableView放在不同的位置,而不是在我的视图控制器的顶部。说到这里,它正试图在顶部添加标题来表示导航栏,但是这是不需要的,因为我的控制器顶部没有标题。

如果我把细胞放在 UITableView的左上角,它不会把细胞放在那里:

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

当我放手的时候,是的——细胞会出现在搜索栏的正下方,但是很明显这是一个问题,你怎样才能让它们出现在搜索栏的正上方。

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

116028 次浏览

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

enter image description here

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

我一定是不小心把一个 UIView 拖进去了,但是我不能选择它,所以我不能删除它。

选择故事板中的桌面视图,并确保样式设置为“普通”,而不是“分组”。您可以在属性检查器选项卡中找到此设置。

我有同样的问题,我很确定我有一个 UIView 在那里一点。只需复制整个表视图,删除它,然后再粘贴一次就可以修复它。

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

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

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

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

A) Interface Builder

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


    (图片由 Dheeraj D提供)

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

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

B)程式化

将此添加到即 viewDidLoad(斯拉夫科 · 佩特科夫斯基的答案和 Cris R的评论的学分)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;


// Swift
self.automaticallyAdjustsScrollViewInsets = false

C)这可能与老学生有关

您可以通过添加

tableView.contentInset = UIEdgeInsetsZero


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

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

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

在我的例子中,我使用的是容器视图(Main View —— > Contaner View —— > UITableView)

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

我所做的是来自 UI Builder:

  • 选择表格视图控制器完成
  • 打开属性检查器
  • 进入-> 查看控制器-> 布局-> “选择想要的全屏幕”

您可以在创建表的 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];

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

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

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

在 My Case 中,我在视图层次结构中的 UITableView 下面有一个 UILabel。

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

你也可以在情节串连板上的视图控制器检查器上尝试检查/取消检查“调整滚动视图插入”。

enter image description here

检查

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • 提及 tableview 委托函数 CellForRowAtIndexPath:
  • 它可以同时处理 ios 6和 ios 7。

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

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

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

我刚找到了解决办法。

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

对我很有效,希望能帮到你们。

在情节串连图板或图表中检查您的桌面视图框架。 在默认情况下,Mine 有一个 y 位置值,因此出现了 bug

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

以上这些都没有帮助到我。 但是做 这确实有帮助:

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

取代 -64,你可以根据导航条的高度放置任何其他数字。

Xcode 8漏洞..。

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

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

在我的应用程序中,我也遇到过类似的问题。我已经设置了 tableView 0的 top edge 插入。还尝试为 automaticallyAdjustsScrollViewInsets设置 false。但没成功。

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

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


return 0.1
}

我正在以编程的方式做这件事,在添加了所有其他子视图之后,我只是简单地将 addSubview (tableView)移到了底部,它解决了我的问题!

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

在2017年,对我有效的只有这一句话

导航控制器?

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

我刚找到了解决办法。 在我的例子中,我使用的是 TabBarViewController,取消选项“调整滚动视图插图”。问题就解决了。 Https://i.stack.imgur.com/vrnfv.png

如果你是在 iOS 11上做这件事,自动调整 ScrollViewInsets 不会工作,因为它是不被推荐的,下面的代码对我来说工作,根据这篇文章中的答案: https://stackoverflow.com/a/44391269/5476481

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

希望这个能帮上忙。

将内容插入设置为零:

在故事板中,将 tableviewcontentInsets设置为 从来没有

enter image description here

在 iOS11及以上版本中,苹果通过改变属性来调整内容插入。使用 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
}

我希望这能帮到你。

在情节串连图板中设置 ViewController 的扩展边缘,以便不检查 underTopBar属性。

遇到了同样的问题。我通过向 viewDidLoad 添加以下内容解决了这个问题。

self.extendedLayoutIncludesOpaqueBars = true

Swift 5

尝试删除 TableHeaderView桌面视图

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

最新答案: 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))