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

时间:2013-09-20 00:06:16

标签: ios objective-c uitableview ios7

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

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

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

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

我将如何做到这一点?有没有更简单的方法?

30 个答案:

答案 0 :(得分:370)

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

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

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

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

a)界面生成器

  • 选择视图控制器
  • 打开属性检查器
  • 在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并且导航栏不透明(无法从屏幕截图中看出)

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

答案 1 :(得分:70)

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

答案 2 :(得分:31)

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

答案 3 :(得分:9)

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

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

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

enter image description here

答案 4 :(得分:5)

上述任何一项都没有帮助我。但是这确实有帮助

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

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

答案 5 :(得分: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;
}

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

在情节提要中,将contentInsets中的tableview设置为从不

enter image description here

答案 8 :(得分:3)

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

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

希望这有帮助。

答案 9 :(得分:3)

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

enter image description here

答案 10 :(得分:2)

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

答案 11 :(得分:2)

在我的申请中,我也遇到过这样的问题。我已经设置了tableView零的上边缘插图。还尝试为simd设置false。但是没有用。

最后我得到了一个有效的解决方案。我不知道这是正确的方法。但实施automaticallyAdjustsScrollViewInsets委托方法对我有用。你必须返回一个非零值来处理它(返回零将显示与以前相同的空格)。

heightForHeaderInSection

答案 12 :(得分:1)

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

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

答案 13 :(得分: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
}

我希望这会对您有所帮助。

答案 14 :(得分:1)

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

navigationController?.navigationBar.isTranslucent = false

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

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

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

中将原型单元格设置为1

答案 17 :(得分:0)

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

答案 18 :(得分:0)

Xcode 8 bug ...

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

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

答案 19 :(得分:0)

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

答案 20 :(得分:0)

我刚刚找到了解决方案。

只需选择tableview和clic Editor - >安排 - >发送到前面

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

答案 21 :(得分: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

答案 22 :(得分: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];

答案 23 :(得分:0)

在我的情况下,我使用的是容器视图。(主视图 - > Contaner视图 - > UITableView)

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

我所做的是来自UI Builder:

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

答案 24 :(得分:0)

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

答案 25 :(得分:0)

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

答案 26 :(得分:0)

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

self.extendedLayoutIncludesOpaqueBars = true

答案 27 :(得分:0)

雨燕5

尝试删除 tableHeaderView tableFooterView

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

答案 28 :(得分:-1)

检查

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

答案 29 :(得分:-1)

将内容插入设置为零: