【发布时间】:2017-05-29 03:24:05
【问题描述】:
我想做什么:
在 Apple 的 Photo 应用程序中,如果您在滚动到任意偏移量的同时旋转设备,则之前位于中心的相同单元格将在旋转后最终位于中心。
我正在尝试使用 UICollectionView 实现相同的行为。 'indexPathsForVisibleItems' 似乎是这样做的方法......
到目前为止我得到了什么:
以下代码提供了旋转之间的平滑操作,但中心项目的计算似乎已关闭:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
self.collectionView?.collectionViewLayout.invalidateLayout()
let middleItem = (self.collectionView?.indexPathsForVisibleItems.count / 2) - 1
let indexPath = self.collectionView?.indexPathsForVisibleItems[middleItem]
coordinator.animate(alongsideTransition: { ctx in
self.collectionView?.layoutIfNeeded()
self.collectionView?.scrollToItem(at: indexPath!, at: .centeredVertically, animated: false)
}, completion: { _ in
})
}
上面的代码有什么问题:
- 纵向 -> 横向:与最终位于中心的单元格有些偏离。
- 人像 -> 风景 -> 人像:完全偏离了人像最初的偏移量。
- 人像 -> 风景 -> 人像 -> 风景:离得远!
注意事项:
- 我必须在旋转时使集合视图布局无效,因为 必须重新计算像元大小和间距。
-
self.collectionView?.layoutIfNeeded() 在动画中
块,使过渡平滑 - 可能是 scrollToItem 在集合视图之前被调用 布局未最终确定,导致滚动偏移不正确?
替代方法?
不使用“indexPathsForVisibleItems”,而只使用“contentOffset”?计算旋转后偏移量?但是,当旋转后的 contentSize 可能与对不同单元格大小、单元格间距等的预期不同时,这怎么可能呢?
【问题讨论】:
-
我在尝试使用
scrollToItem制作自定义动画时总是遇到麻烦。也许尝试将该行放在完成块中,看看您是否真的针对正确的单元格和位置。如果这行得通,我认为您将不得不做一些巧妙的计算来为contentOffset设置动画,而不是使用scrollToItem。 -
如果我在完成后放置scrollToItem,它会在设备旋转后创建一个辅助滚动动画。当它不仅仅是一个简单的动画时,看起来就感觉不对......
-
我只是建议将其作为调试的中间步骤 - 检查问题是否在于您如何计算中心单元格以及
scrollToItem将如何定位它,或者是否与动画。 -
我认为 scrollToItem 发生在新布局未完成时。
-
@Gizmodo 我遇到了同样的问题。如果你能分享一些对你有用的代码,那就太好了。
标签: ios swift uiscrollview uicollectionview uicollectionviewlayout