2016-08-18 47 views
2

我想制作一个像iOS主屏幕文件夹的动画。我在主视图控制器和容器视图中有一个容器视图,我在两个视图控制器之间用动画切换。
这里是主视图控制器类的代码:动画过程中错误的帧值

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) 

     } 

    } 

} 

所有的代码工作正常,除了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)称定finalFrame到一个错误的值:

  • 当它呈现快照进入中间的屏幕
  • 当它解雇时,快照靠近他的正确位置。

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)线工作在这种方式:

  • 检查它是否呈现
  • 如果它正在呈现设定常数到最终文件夹的视图
  • 如果它正在解散,则将该折叠的超级视图中的所选集合视图单元的folderView的值转换为框架 erView

这里是整个项目:https://github.com/ale00/OnteamAnon

+0

对不起,如果我犯了一些语言错误,我是意大利人 – ale00

回答

2

由于您使用的自动布局在projectViewController您containerView的大小,你需要你的这部分代码后打电话到layoutIfNeeded()self.containerView

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

所以就变成:

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

谢谢,它现在可行!我认为这是问题,但我没有测试它... – ale00