2016-07-18 38 views
3

アニメーションの終了時に黒い画面が表示されることを除いて、正しく動作するカスタムアニメーションがあります。iOS 10 - カスタムアニメーション後の黒い画面

遷移のコードは次のとおり

class FolderAnimationController: NSObject, UIViewControllerAnimatedTransitioning { 

    let duration = 5.0 
    var presenting = true 
    var originFrame = CGRect.zero 
    var selectedFolderCell: FolderCollectionViewCell? 

    func transitionDuration(_ transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return duration 
    } 

    func animateTransition(_ transitionContext: UIViewControllerContextTransitioning) { 

     let containerView = transitionContext.containerView() 
     let toViewC = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey)! 
     let fromViewC = transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey)! 
     let folderViewC = presenting ? fromViewC as! ViewController : transitionContext.viewController(forKey: UITransitionContextToViewControllerKey) as! ViewController 
     let projectViewC = presenting ? toViewC as! ProjectViewController : transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey) as! ProjectViewController 

     let cellView = presenting ? (folderViewC.folderCollectionView.cellForItem(at: (folderViewC.folderCollectionView.indexPathsForSelectedItems()?.first!)!) as! FolderCollectionViewCell).folderView : projectViewC.containerView 
     let cellSnapshot: UIView = presenting ? cellView!.snapshotView(afterScreenUpdates: false)! : cellView!.snapshotView(afterScreenUpdates: false)! 
     let cellFrame = containerView.convert(cellView!.frame, from: cellView!.superview) 
     cellSnapshot.frame = cellFrame 
     cellView!.isHidden = true 

     toViewC.view.frame = transitionContext.finalFrame(for: toViewC) 
     toViewC.view.layoutIfNeeded() 
     toViewC.view.alpha = 0 

     presenting ? (projectViewC.containerView.isHidden = true) : (self.selectedFolderCell!.folderView.isHidden = true) 
     containerView.addSubview(toViewC.view) 
     containerView.addSubview(cellSnapshot) 

     UIView.animate(withDuration: duration, animations: { 

      toViewC.view.alpha = 1.0 

      let finalFrame = self.presenting ? projectViewC.containerView.frame : self.originFrame 
      cellSnapshot.frame = finalFrame 
     }) { (_) in 
      self.presenting ? (projectViewC.containerView.isHidden = false) : (self.selectedFolderCell?.isHidden = false) 
      cellSnapshot.removeFromSuperview() 
      transitionContext.completeTransition(true) 

     } 

    } 
} 

アニメーションを呼び出す最初のビューコントローラのコードは:

func animationController(forPresentedController presented: UIViewController, presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    presentAnimator.presenting = true 
    presentAnimator.originFrame = openingFrame! 
    presentAnimator.selectedFolderCell = selectedCell! 

    return presentAnimator 
} 

func animationController(forDismissedController dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    presentAnimator.presenting = false 

    return presentAnimator 
} 

答えて

0

のXcode 8の最初のベータにバグがありました。それは2番目のベータ版で解決されました。

1

代わりにUIViewPropertyAnimator.runningPropertyAnimatorを使用してください。UIView.animate