ViewWillTransitonToSize 旋转动画
ViewWillTransitonToSize rotation Animation
我正在尝试替换我的 UIcollectionView 上的默认 iOS 设备旋转动画。
我在 transitionCoordinator 上使用 viewWillTransitionToSize 和 targetTransform() 来防止默认视图旋转,然后使用变换将每个 visibleCell 旋转到正确的方向。
它工作正常,除了:
- 可见矩形外边界上的单元格未旋转。
- 我的日志显示 collectionView.visibleCells() 数组给出了它应有的功能:可见单元格,但我发现如果我让视图以默认动画旋转,则 visibleCells 数组给出我是可见细胞加上附近的细胞。
- 我一直在尝试访问这些 "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 存储库中查看代码。
出于单元格重用的目的,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
}
我正在尝试替换我的 UIcollectionView 上的默认 iOS 设备旋转动画。 我在 transitionCoordinator 上使用 viewWillTransitionToSize 和 targetTransform() 来防止默认视图旋转,然后使用变换将每个 visibleCell 旋转到正确的方向。 它工作正常,除了:
- 可见矩形外边界上的单元格未旋转。
- 我的日志显示 collectionView.visibleCells() 数组给出了它应有的功能:可见单元格,但我发现如果我让视图以默认动画旋转,则 visibleCells 数组给出我是可见细胞加上附近的细胞。
- 我一直在尝试访问这些 "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 存储库中查看代码。
出于单元格重用的目的,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
}