2017-08-07 12 views
1

は私がカスタムUINavigationControllerアニメーション

class NavDelegate: NSObject, UINavigationControllerDelegate { 
    private let animator = Animator() 

    func navigationController(_ navigationController: UINavigationController, 
           animationControllerFor operation: UINavigationControllerOperation, 
           from fromVC: UIViewController, 
           to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return animator 
    } 
} 

class Animator: NSObject, UIViewControllerAnimatedTransitioning { 
    func transitionDuration(using context: UIViewControllerContextTransitioning?) -> TimeInterval { 
     return 10.0 
    } 

    func animateTransition(using context: UIViewControllerContextTransitioning) { 
     let fromViewController = context.viewController(forKey: UITransitionContextViewControllerKey.from)! 
     let toViewController = context.viewController(forKey: UITransitionContextViewControllerKey.to)! 
     if fromViewController is ViewController { 
      self.pushAnimation(from: fromViewController as! ViewController, 
           to: toViewController as! VC2ViewController, 
           with: context) 
     } 

     if toViewController is ViewController { 
      print("pop") 
     } 

    } 

    func pushAnimation(from viewController: ViewController, 
         to destinationViewController: VC2ViewController, 
         with context: UIViewControllerContextTransitioning) { 

     context.containerView.addSubview(destinationViewController.view) 


     //block 1 
     for cell in viewController.tableView1.visibleCells { 
      if let castCell = cell as? VC1TableViewCell { 
       castCell.contentViewToLeft.constant = -UIScreen.main.bounds.width 
       castCell.contentViewToRight.constant = UIScreen.main.bounds.width 
       let duration = Double(viewController.tableView1.visibleCells.index(of: cell)!)/Double(viewController.tableView1.visibleCells.count) + 0.2 
       UIView.animate(withDuration: duration, animations: { 
        castCell.layoutIfNeeded() 
       }) { animated in 
       } 
      } 
     } 

     //block 2 
     for cell in destinationViewController.tableView2.visibleCells { 
      if let castCell = cell as? VC2TableViewCell { 
       castCell.contentViewToLeft.constant = -UIScreen.main.bounds.width 
       castCell.contentViewToRight.constant = UIScreen.main.bounds.width 
       let duration = Double(destinationViewController.tableView2.visibleCells.index(of: cell)!)/Double(destinationViewController.tableView2.visibleCells.count) + 0.2 
       UIView.animate(withDuration: duration, animations: { 
        castCell.layoutIfNeeded() 
       }) { animated in 
        if duration > 1.1 { 
         context.completeTransition(!context.transitionWasCancelled) 
        } 
       } 
      } 
     } 
    } 
} 

を持っているものの問題はあるが、layoutIfNeeded()はアニメーションなしで実行し、先のコントローラ(ブロック2)の制約のアニメーションはアニメーションされることはありませんということですブロック1が動作しています。何が問題なのでしょうか?

答えて

0

私は日のテストのカップル

transitionDuration(using context: UIViewControllerContextTransitioning?)

機能を費やし、それはすべてのDispatchQueue.main.async {}内部toViewControllerアニメーションのいくつかのブロックを呼び出すことについてであることがわかりました。どのように動作するのかわかりませんが、私が計画していたように私のコードを動作させました。

関連する問題