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

问题描述 投票:164回答:29

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

如果我把UITableView的左上角放在我想要细胞的位置,它就不会将细胞放在那里:

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

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

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

ios objective-c uitableview ios7
29个回答
370
投票

当你向下滚动时,UITableView的细胞是否显示在空白区域?

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

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

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

a)Interface Builder

  • 选择视图控制器
  • 打开属性检查器
  • 在IB的属性检查器中(当选择了视图控制器时),有一个名为“调整滚动视图插入”的属性,默认情况下处于打开状态。取消选中此选项: (图片由Dheeraj D提供)

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

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

b)以编程方式

将此添加到即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并且导航栏不透明(无法从屏幕截图中看出)

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

3
投票

在故事板中,将contentInsetstableview设置为Never

enter image description here


2
投票

检查storyboard或xib中的tableview框架。我默认有一个y位置值,因此是bug


2
投票

在我的应用程序中,我也经历过这样的问题。我设置了tableView零的上边缘插图。还试过为false设置automaticallyAdjustsScrollViewInsets。但没有奏效。

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

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

    return 0.1
}

1
投票

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


1
投票

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

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


1
投票

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

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


1
投票

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

navigationController?.navigationBar.isTranslucent = false

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


1
投票

在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
}

我希望这能帮到您。


0
投票

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


0
投票

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


70
投票

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


0
投票

我刚刚找到了解决方案。

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

它对我有用,希望它能帮到你们所有人。


0
投票

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


0
投票

Xcode 8 bug ...

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

将表的样式设置为Grouped,然后再返回Plain。这删除了我的应用程序在我的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
投票

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


0
投票

在故事板中设置ViewController的扩展边缘,以便取消选中underTopBar属性。


0
投票

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

self.extendedLayoutIncludesOpaqueBars = true

-1
投票

检查

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

-1
投票

将内容insets设置为零:


32
投票

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


9
投票

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

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

您还可以尝试在故事板上的视图控制器检查器上检查/取消选中“调整滚动视图插入”。


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

3
投票

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


3
投票

我仍然不确定是什么原因造成顶部的额外空间,但我发现用空格删除UITableView并用新的替换它占用了空间。

我一定是在那里意外拖了一个UIView,但我无法选择它所以我无法删除。


3
投票

如果您在iOS 11上执行此操作,则selfAdjustsScrollViewInsets将无法使用,因为它已弃用,以下代码适用于我,根据此帖子中的答案:https://stackoverflow.com/a/44391269/5476481

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

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.