【问题标题】:UICollectionVIew: How can I remove the space on top first cell's row?UICollectionVIew:如何删除顶部第一个单元格行的空间?
【发布时间】:2014-07-10 06:33:38
【问题描述】:

我在Interface Builder中有这样的安排,所有的属性都设置为零。

但是,当我在设备和模拟器上运行它时,它看起来像这样

单元格上方的空间来自哪里?

所以我尝试在这样的代码中为 UICollectionViewFlowLayout 设置这些属性

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    layout.headerReferenceSize = CGSizeZero;
    layout.footerReferenceSize = CGSizeZero;
    layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
    layout.minimumInteritemSpacing = 0;
    layout.minimumLineSpacing = 0;
    layout.itemSize = CGSizeMake(103, 119);
    
    self.calendarView.collectionViewLayout = layout;

但我没有运气。

我怎样才能摆脱那个空间?

【问题讨论】:

    标签: ios uicollectionview uicollectionviewlayout


    【解决方案1】:

    iOS 11 不推荐使用automaticallyAdjustsScrollViewInsets,因此建议使用collectionView.contentInsetAdjustmentBehavior = .never

    【讨论】:

    • 这是唯一对我有用的解决方案。非常感谢!虽然我使用界面生成器来实现这一点。
    • 这对我也有用!我在屏幕顶部有一个空白区域。自动更改AdjustsScrollViewInsets 什么也没做
    • 这对于那些只使用 UICollectionView 的人来说是正确的答案,谢谢哥们
    【解决方案2】:

    斯威夫特 3:

    self.automaticallyAdjustsScrollViewInsets = false
    

    【讨论】:

      【解决方案3】:

      您可以在 Interface Builder 中执行此操作,方法是转到 Scroll View 部分并将 Content insets 下拉菜单更改为“从不”。

      【讨论】:

        【解决方案4】:

        这个答案很奇怪,但如果您在 Interface Builder 中工作并且将 Collection View 嵌入在 View Controller 中,该 View Controller 由作为 Navigation Controller 的根视图控制器的 Tab Bar Controller 控制,则它可以工作。

        • 将工具栏添加到具有集合视图的视图控制器
        • 在层次结构中移动工具栏,使其位于集合视图上方

        如果 Toolbar 位于 Collection View 上方,则从原型 Collection View Cell 顶部到 Collection View 之间将没有空间。如果没有 Toolbar 或 Toolbar 在 Collection View 下方,则 Collection View 顶部和 Collection View Cell 之间会有空间。在 Storyboard 预览和运行应用程序时都是如此。表视图也会发生相同类型的事情。

        这是最近使用 Xcode 版本 8.3.3 测试的

        【讨论】:

          【解决方案5】:

          另一种方法是选择您的 ViewController 并取消选中界面构建器中的复选框 Adjust Scroll View Insets

          它与下面的代码行基本相同。但是您必须立即在界面构建器中看到您的更改。

          automaticallyAdjustsScrollViewInsets = false
          

          【讨论】:

          • 非常感谢您发布此解决方案。它完美无瑕!
          【解决方案6】:

          这里是经过一些调整的快速答案:

          我有一个占视图的一小部分的集合视图。我用过:

          self.automaticallyAdjustsScrollViewInsets = false
          

          删除弄乱我的布局的顶部间距。这段代码对我不起作用:

          self.paperCollectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
          

          这个也没有:

          self.paperCollectionView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0)
          

          但这可能是因为我没有使用 UICollectionViewController,我只是使用了 UICollectionView。

          下面是代码的较大部分以提供更多上下文:

          【讨论】:

          • 您找到解决方案了吗?我只能看到有问题的增强。我使用UIViewController 而不是UICollectionViewControllel 也有同样的情况
          • 所以我使用了self.automaticallyAdjustsScrollViewInsets = false,这解决了我的间距问题。你能再解释一下,也许我可以提供更多帮助吗?
          【解决方案7】:

          你也可以去

          [self.calendarView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
          [self setAutomaticallyAdjustsScrollViewInsets:NO];
          

          默认情况下,在集合视图上添加了集合视图标题滚动空间,您不需要从顶部添加 -20,因为它可能会反映设备问题

          【讨论】:

            【解决方案8】:

            UICollectionView 是具有contentInset 属性的 UIScrollView 类的后代,设置 -20 top inset 可以解决问题

            [self.calendarView setContentInset:UIEdgeInsetsMake(-20, 0, 0, 0)];
            

            然而,问题来自 UIViewController 的 automaticallyAdjustsScrollViewInsets 属性。 通过文档:

            默认值为 YES,它允许视图控制器调整其滚动视图插入以响应状态栏、导航栏和工具栏或选项卡栏所占用的屏幕区域。如果您想自己管理滚动视图插图调整,请设置为 NO。

            这就是我们为状态栏调整内容插图的原因。最好禁用自动调整而不是手动设置结果图片不匹配的值。

            [self setAutomaticallyAdjustsScrollViewInsets:NO];
            

            【讨论】:

            • 虽然它引导我找到正确的答案。我必须将边缘插图设置为(-20,0,0,0)。不知道为什么需要。但是谢谢。您可以编辑您的答案,以便我投票。
            • 好吧,我终于知道是什么原因了...我必须设置 self.automaticallyAdjustsScrollViewInsets = NO;它会正常工作。 (从某种程度上等于状态栏高度的插入量注意到它)
            • 谢谢,我们错过了。
            • 在 iPhone X 时代,谁知道接下来会发生什么,假设 20 作为状态栏的高度是错误的。为了安全起见,请始终参考实际高度。