ViewWillTransitonToSize 旋转动画

ViewWillTransitonToSize rotation Animation

我正在尝试替换我的 UIcollectionView 上的默认 iOS 设备旋转动画。 我在 transitionCoordinator 上使用 viewWillTransitionToSize 和 targetTransform() 来防止默认视图旋转,然后使用变换将每个 visibleCell 旋转到正确的方向。 它工作正常,除了:

  1. 可见矩形外边界上的单元格未旋转。
  2. 我的日志显示 collectionView.visibleCells() 数组给出了它应有的功能:可见单元格,但我发现如果我让视图以默认动画旋转,则 visibleCells 数组给出我是可见细胞加上附近的细胞。
  3. 我一直在尝试访问这些 "neighbourhood" 单元格以便我可以旋转它们,但我的所有尝试都失败了。

这是我对 ViewWillTransitionTosize 的实现:

override func viewWillTransitionToSize( size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator){
       super.viewWillTransitionToSize(size , withTransitionCoordinator: coordinator)

      let transf : CGAffineTransform = coordinator.targetTransform()
      let invertedRotation = CGAffineTransformInvert(transf)
      let currentBounds = view.bounds
     coordinator.animateAlongsideTransition({
     _ in

     self.view.transform = CGAffineTransformConcat(self.view.transform, invertedRotation )
        self.undoRotation =  CGAffineTransformConcat(self.undoRotation, transf)
     self.view.bounds = currentBounds
}, completion: ({ finished in
         if ( finished != nil){

                 UIView.animateWithDuration(0.5,  animations: {
                 for cell  in self.collectionView!.visibleCells(){
                    cell.contentView.transform = self.undoRotation
                 }
             })}
         })
)

这是一个快速的 gif。说明问题:http://www.blessinglopes.com/Info

任何帮助将不胜感激! 谢谢!

我已经通过实现一个单独的线程来解决这个问题,在该线程中对单元格进行动画处理。您可以在下面的 git 存储库中查看代码。

https://github.com/rakeshbs/RotatingCollectionView

出于单元格重用的目的,collectionView:cellForItemAtIndexPath 将在您滚动时始终被调用。 如此简单,确保所有新出现的单元格都应用了正确的新方向。例如,在单元格出队后,在您的 collectionView:cellForItemAtIndexPath 中添加此行 cell.contentView.transform = self.counterRotation

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell : MyCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("CellIdentifier", forIndexPath: indexPath) as MyCollectionViewCell
    cell.imageView.image = UIImage(named: "MyImg")!
    cell.contentView.transform = self.undoRotation
    return cell
}