2016-08-18 1 views
2

Ich möchte eine Animation wie iOS Home-Bildschirm-Ordner machen. Ich habe eine Containeransicht in einem Hauptansicht-Controller und in der Containeransicht wechsle ich zwischen zwei View-Controllern mit einer Animation.
Hier ist der Code der Haupt-View-Controller-Klasse:Falsche Frame-Werte während der Animation

  • , wenn es die Snapshot präsentiert geht in der Mitte:

    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) 
    
         } 
    
        } 
    
    } 
    

    der Code korrekt, außer 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) die finalFrame auf einen falschen Wert eingestellt Alle Werke des Bildschirms

  • wenn es den Snapshot ablehnt geht in die Nähe seiner richtigen Position.

Die 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) Linie funktioniert auf diese Weise:

  • prüfen, ob es
  • präsentiert, wenn es um die Konstante zu dem Rahmen Wert der endgültigen Ordner festgelegt präsentiert Ansicht
  • Wenn es ablehnt konvertieren Sie den Rahmen Wert der Ordneransicht der ausgewählten Collection View Cell aus dem Superview dieser Falte erView

Hier ist das gesamte Projekt: https://github.com/ale00/OnteamAnon

+0

Sorry, wenn ich ein paar Fehler mit der Sprache gemacht habe, bin ich italienisch – ale00

Antwort

2

Da Sie Auto-Layout für die Größe Ihres containerView in projectViewController verwenden, müssen Sie layoutIfNeeded() auf self.containerView nach diesem Teil des Codes nennen:

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

So wird es:

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

Danke, es funktioniert jetzt! Ich dachte, das wäre das Problem, aber dann habe ich es nicht getestet ... – ale00

Verwandte Themen