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)
diefinalFrame
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
Sorry, wenn ich ein paar Fehler mit der Sprache gemacht habe, bin ich italienisch – ale00