【问题标题】:UICollectionView contentOffset changes with custom layoutUICollectionView contentOffset 随自定义布局而变化
【发布时间】:2013-07-16 22:42:56
【问题描述】:

我有一个带有自定义 UICollectionViewLayout 的 UICollectionView(实际上,我使用的是 this nice layout)。

我在 viewDidLoad 中设置了contentOffset = CGPointZero。然而,在 viewDidLoad 之后,偏移量为 -20,内容被下推,如下所示:


(它应该与线齐平)。我正在界面构建器中加载集合视图布局。看来我的问题与this one 非常相似,但是那里的解决方案对我不起作用。

我尝试在布局实现中修改collectionViewContentSize,以确保它始终大于collectionView 的大小。虽然这意味着我可以向下滚动我的内容(它比 collectionView 的高度短)并隐藏额外的空间,但我也可以向上滚动以查看它。

似乎没有任何效果!

【问题讨论】:

    标签: ios uicollectionview uicollectionviewlayout contentoffset


    【解决方案1】:

    我找到了发生这种情况的原因。检查此问题的已接受答案: Status bar and navigation bar appear over my view's bounds in iOS 7

    确实,我们可以在viewDidLoad 的IB(如果您使用Storyboard)中设置UIViewController 的edgesForExtendedLayoutautomaticallyAdjustsScrollViewInsets 属性,它会解决我们的问题。

    请不要忘记检查此属性是否可用,因为在 iOS6 或更早版本中它会导致崩溃:

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

    问候!

    【讨论】:

    • 请注意,如果您有一个包含在父视图控制器中的集合视图控制器,您必须在 parent 控制器上设置automaticallyAdjustsScrollViewInsets
    • 我有一个案例,我想放置一个 74h x 30w 个单元格的 collectionView,每次我从父视图控制器移动到另一个时,这些单元格都会偏移 -44。通过尝试这么多错误的方法试图解决这个问题将近两个小时。谢谢。
    • 您所指的接受的答案没有提到任何关于自定义布局的内容。
    • @bio,是的,虽然我认为在这种情况下这并不重要。
    【解决方案2】:

    我能想出的唯一解决方案是几乎不能接受的行为:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        if (self.collectionView.contentOffset.y < 0) {
            self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0);
        }
    }
    

    以及在collectionViewContentSize中将内容的高度设置为fmax(self.collectionView.frame.size.height + 20, [self stackedSectionHeight])

    这会删除节标题上方的空间,但会删除顶部的“反弹”。一个相当次优的解决方案,但相当可接受。

    如果有人有更好的答案,我会接受,或者如果我找到了,我会更新这个答案。

    【讨论】:

    • 我在使用水平布局时也遇到了类似的问题。
    • 在 Veritacal 布局中,内容还可以。当将布局对象更改为水平时,所有内容都会消失
    • 我找到了相同的问题和相同的解决方案。我只在 iOS7 SDK 上得到这个,并且只有在 iOS7 上运行时。最奇怪的是其他viewController中的另一个scrollView没有这个问题..我打破了我的头,但没有找到原因
    【解决方案3】:

    我开始发现这个问题出现在 iOS 11 上,我在滚动视图中有一个滚动视图。我花了将近一天的时间才弄明白。

    尝试设置内容插入调整行为:

    if #available(iOS 11.0, *) {
        scrollView.contentInsetAdjustmentBehavior = .never
    }
    

    这修复了我的 collectionview 调整它的内容插入少量,因为 collectionview 框架会移过封闭滚动视图的安全区域。

    【讨论】:

      【解决方案4】:
      let oldContentSizeHeight: CGFloat = self.colName.contentSize.height
              self.colName.reloadData()
              self.colName.layoutIfNeeded()
              self.view.layoutIfNeeded()
              self.colName.contentOffset.y = self.colName.contentOffset.y + (self.colName.contentSize.height - oldContentSizeHeight)
      

      【讨论】:

        【解决方案5】:

        这是正确答案的 swift 4.2 版本,但要使其可行,您必须添加协议UIScrollViewDelegate

        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            if self.collectionView.contentOffset.y < 0 {
                self.collectionView.contentOffset = CGPoint(x: self.collectionView.contentOffset.x, y: 0.0)
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-28
          • 1970-01-01
          • 1970-01-01
          • 2012-10-11
          相关资源
          最近更新 更多