我有一个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:
找到了scrollToItemAtIndexPath...
如果我尝试在加载所有内容后以编程方式触发滚动(没有任何反应),则无法正常工作scrollRectToVisible...
没有collectionView?.contentInset = UIEdgeInsetsZero
不会改变任何内容缺少哪些要点?
答案 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!