初始化后,UICollectionView不会滚动

时间:2015-11-24 16:16:07

标签: ios swift uiscrollview uicollectionview

我有一个UICollectionViewController的子类,它嵌套在UINavigationController中。该集合包含几个单元格(当前为3个),每个单元格与全屏一样大。

当显示整个事物时,集合视图会初始滚动到特定单元格(对于每个单元格都可以完美运行):

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if let path = currentlyPresentedPhotoCellIndexPath { // this is set in the beginning
        collectionView?.scrollToItemAtIndexPath(path, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: false)
    }
}

但是,集合视图拒绝水平滚动,此后就像禁用了用户交互一样。我不确定发生了什么,但这是我到目前为止所检查的内容:

  • 为集合视图启用了用户交互
  • 正确请求下一个单元格(向右或向左,取决于滚动方向),我通过检查collectionView:cellForItemAtIndexPath:找到了
  • 请求的imagePath是正确的
  • scrollToItemAtIndexPath...如果我尝试在加载所有内容后以编程方式触发滚动(没有任何反应),则无法正常工作
  • scrollRectToVisible...没有
  • 在进行程序化滚动尝试之前设置collectionView?.contentInset = UIEdgeInsetsZero不会改变任何内容
  • 集合视图的内容大小为3072x768(= 3个屏幕,即3个单元格)

缺少哪些要点?

1 个答案:

答案 0 :(得分:1)

虽然帖子并没有准确地解决我问题的根源,但它迫使我思考我发布的代码。如果你看一下,你会看到它基本上说:每当需要布置视图时,滚动到位置 CurrentlyPresentedPhotoCellIndexPath 的单元格。但是,如果没有任何上下文,这个变量只能在整个控制器初始化时设置一次。因此,当您尝试滚动时,布局会发生变化,然后控制器会跳回到初始单元格,看起来根本没有任何反应。

要更改此设置,您只需强制执行单个滚动,例如通过这样做:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if let path = currentlyPresentedPhotoCellIndexPath { // only once possible
        collectionView?.scrollToItemAtIndexPath(path, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: false)
        currentlyPresentedPhotoCellIndexPath = nil // because of this line
        // "initiallyPresentedPhotoCellIndexPath" would probably a better name
    }
} 

非常感谢Mr.T!