【问题标题】:UICollectionView adds top marginUICollectionView 添加上边距
【发布时间】:2013-10-25 00:59:22
【问题描述】:

我想放置一个水平显示拇指的 UICollectionView 控件(只有一行拇指)。出于某种原因,UICollectionView 将拇指向下推 44 像素,因此“0”高度实际上是“44”。我认为它可能会添加这个空间来考虑导航栏的高度(我只是假设)。由于我的 UICollectionView 只在屏幕的一部分上,我不想要这个边距。有没有办法去掉?

【问题讨论】:

标签: ios7 uicollectionview


【解决方案1】:

也许您可以尝试使用集合视图的委托流布局将该值强制为 0:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(PADDING_TOP, PADDING_LEFT, PADDING_BOTTOM, PADDING_RIGHT);
}

修改填充的值。

【讨论】:

    【解决方案2】:

    问题可能出在集合视图的内容插图中。 尝试将self.automaticallyAdjustsScrollViewInsets = NO; 添加到视图控制器的viewDidLoad 方法中。

    【讨论】:

    • 效果很好。很奇怪这件事不能在情节提要上解决。
    • 这是我见过的最愚蠢的事情!浪费了这么多时间!
    • 我已经花了好几个小时了 :) 非常感谢伙计
    • @bashan 可以在 storyboard 上完成,有一个名为“Adjust Scroll View Insets”的复选框
    • 请注意,如果您使用的是嵌入 segue,并且您的集合视图控制器是嵌入式控制器,则需要将此方法调用到 PARENT 控制器,而不是在您的 UICollectionViewController 中
    【解决方案3】:

    您也可以在情节提要中进行设置。

    确保您已选择 ViewController,然后取消选中“调整滚动视图插图”。

    我还没有测试过这个 IB/Storyboard 方法在 iOS6 上的作用。使用代码方法,您需要检查 VC 是否响应该方法:

    if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
    self.automaticallyAdjustsScrollViewInsets = NO;
    }
    

    【讨论】:

    • 谢谢老兄,这为我节省了很多时间和进步,真的节省了。
    【解决方案4】:

    我发现添加:

    self.edgesForExtendedLayout = UIRectEdgeNone;
    

    在视图控制器中,我正在加载 UICollectionView 解决了这个问题,因为我无法获得接受的答案。

    我找到这个答案的问题可以在here 找到,并提供了一个非常深入和有趣的解释,说明自动调整的滚动视图插图、扩展布局和扩展布局的边缘之间的区别。

    值得一读

    【讨论】:

      【解决方案5】:

      类似于@Sviatoslav 的回答,您可以尝试以下方法:

      - (void) viewDidLayoutSubviews {
          [super viewDidLayoutSubviews];
      
          yourCollectionView.contentOffset = CGPointMake(0, 0);
      }
      

      【讨论】:

        【解决方案6】:

        斯威夫特 3:

        首先您要将 viewControllers automaticallyAdjustsScrollViewInsets 设置为 false:

        self.automaticallyAdjustsScrollViewInsets = false
        

        然后,您应该能够相应地调整边缘插图:

        func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
            //top, left, bottom, right
            return UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
        }
        

        【讨论】:

          【解决方案7】:

          正如其他人提到的,viewController.automaticallyAdjustsScrollViewInsets 一直是deprecated since iOS 11。我的解决方案...

          Swift 4.2、Xcode 10.1、iOS 12.1:

          由于某种原因,collectionView.contentSize.height 看起来比我的集合视图的解析高度要小。首先,我使用了相对于父视图高度的 1/2 的自动布局约束。 为了解决这个问题,我将约束更改为相对于视图的“安全区域”。

          这允许我使用collectionView.contentSize.height 设置单元格高度以垂直填充我的集合视图:

          private func setCellSize() {
              let height: CGFloat = (collectionView.contentSize.height) / CGFloat(numberOfRows)
              let width: CGFloat = view.frame.width - CGFloat(horizontalCellMargin * 2)
          
              let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
              layout.itemSize = CGSize(width: width, height: height)
          }
          

          之前

          之后

          【讨论】:

            【解决方案8】:

            尝试在集合视图上使用self.feedCollectionView.contentInsetAdjustmentBehavior = .never。这实际上对我有用。

            【讨论】:

              【解决方案9】:

              Swift 5.2 / Xcode 11.3

              viewController.automaticallyAdjustsScrollViewInsets 
              

              自 iOS 11 起已被弃用。

              我的解决方案:

              collectionView.contentInsetAdjustmentBehavior = .never
              

              【讨论】: