我有一个UICollectionView
和horizontal scrolling
和paging
。单元格应始终为屏幕尺寸,因此,当设备方向发生变化时,会调用collectionView.collectionViewLayout.invalidateLayout()
,并重新计算item size
和collection view offset
,它会很好地工作。
当转到另一个视图控制器,然后旋转并返回到具有集合视图的视图控制器时,会发生此问题。然后,看来集合视图没有考虑方向变化或类似情况,并且可能有两个可见的单元格,这是不应该发生的。回到带有集合视图的视图控制器时,还会出现一些奇怪的动画。这些应该如何解决?
以下是一些代码:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
coordinator.animate(alongsideTransition: { (context) in
}) { (context) in
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return collectionView.frame.size
}
func collectionView(_ collectionView: UICollectionView, targetContentOffsetForProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
let width = collectionView.frame.size.width
let visibleCells = collectionView.visibleCells
if visibleCells.count == 0 {
return CGPoint.zero
}
let cell = visibleCells[0]
let indexPath = collectionView.indexPath(for: cell)
let index = indexPath?.item
let offsetX = CGFloat(index!) * width
let offsetY: CGFloat = 0
let offset = CGPoint(x: offsetX, y: offsetY)
return offset
}
尝试解决此问题,我在viewDidAppear
中打了以下电话,但没有运气:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
collectionView.collectionViewLayout.invalidateLayout()
collectionView.layoutSubviews()
}