2016-08-18 1 views
2

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

+0

Désolé si j'ai fait quelques erreurs avec la langue, je suis italien – ale00

Répondre

2

Puisque vous utilisez la mise en page automatique pour la taille de votre containerView à projectViewController, vous devez appeler layoutIfNeeded() sur self.containerView après cette partie de votre code:

self.addChildViewController(toViewController) 
self.containerView.addSubview(toViewController.view) 
self.containerView.addSubview(cellSnapshot) 

il devient:

self.addChildViewController(toViewController) 
self.containerView.addSubview(toViewController.view) 
self.containerView.addSubview(cellSnapshot) 
self.containerView.layoutIfNeeded()  
+0

Merci, ça marche maintenant! Je pensais que c'était le problème, mais je ne l'ai pas testé ... – ale00