Je souhaite créer une animation telle qu'un dossier d'écran d'accueil iOS. J'ai une vue de conteneur dans un contrôleur de vue principale et dans la vue de récipient je permute entre deux contrôleurs de vue avec une animation.
est ici le code de Main Voir Classe contrôleur:Valeurs de trames incorrectes pendant l'animation
class MainContainerViewController: UIViewController {
@IBOutlet weak var containerView: UIView!
let duration = 1.0
var presenting = true
var originFrame = CGRect.zero
var indexPathSelectedCell: IndexPath?
var dismissCompletion: (()->())?
func cycle(fromViewController: UIViewController, toViewController: UIViewController) {
let folderViewC = (presenting ? fromViewController : toViewController) as! ViewController
let projectViewC = (presenting ? toViewController : fromViewController) as! ProjectViewController
let cellView = (presenting ? (folderViewC.folderCollectionView.cellForItem(at: folderViewC.folderCollectionView.indexPathsForSelectedItems!.first!) as! FolderCollectionViewCell).folderView : projectViewC.containerView)!
let cellSnapshot = cellView.snapshotView(afterScreenUpdates: false)!
let cellFrame = containerView.convert(cellView.frame, from: cellView.superview)
cellSnapshot.frame = cellFrame
cellView.isHidden = true
toViewController.view.frame = self.containerView.frame
toViewController.view.layoutIfNeeded()
toViewController.view.alpha = 0
presenting ? (projectViewC.containerView.isHidden = true) : ((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.isHidden = true)
fromViewController.willMove(toParentViewController: nil)
self.addChildViewController(toViewController)
self.containerView.addSubview(toViewController.view)
self.containerView.addSubview(cellSnapshot)
UIView.animate(withDuration: duration, animations: {
toViewController.view.alpha = 1.0
let finalFrame = self.presenting ? projectViewC.containerView.frame : self.containerView.convert((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.frame, from: (folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.superview)
cellSnapshot.frame = finalFrame
}) { (_) in
if !self.presenting {
self.dismissCompletion?()
}
self.presenting ? (projectViewC.containerView.isHidden = false) : ((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.isHidden = false)
cellSnapshot.removeFromSuperview()
fromViewController.view.removeFromSuperview()
fromViewController.removeFromParentViewController()
toViewController.didMove(toParentViewController: nil)
}
}
}
Tout le code fonctionne correctement, sauf let finalFrame = self.presenting ? projectViewC.containerView.frame : self.containerView.convert((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.frame, from: (folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.superview)
qui a mis finalFrame
à une valeur erronée:
- quand il présente l'instantané va au milieu Lorsque l'image est rejetée, l'instantané se rapproche de sa position correcte.
La ligne let finalFrame = self.presenting ? projectViewC.containerView.frame : self.containerView.convert((folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.frame, from: (folderViewC.folderCollectionView.cellForItem(at: self.indexPathSelectedCell!) as! FolderCollectionViewCell).folderView.superview)
fonctionne de cette façon:
- vérifier si elle présente
- si elle présente régler la constante à la valeur du cadre du dernier dossier vue
- si elle est rejetée convertir le cadre valeur du dossierView de la cellule de vue de collection sélectionnée à partir de la vue d'ensemble de ce pli erView
Voici l'ensemble du projet: https://github.com/ale00/OnteamAnon
Désolé si j'ai fait quelques erreurs avec la langue, je suis italien – ale00