2017-12-14 6 views
1

このトピックについては、多くの優れた回答がありますが、これは私には混乱しています。複数のカスタムアニメーションが同期していない

2つのコメントアウトされた行が正しく動作しないようです。私はこのカスタムセグをスライドと縮小の両方にしたいので、効果はfromVCが何も消えることなく、toVCは底から何も届きません。

ただし、両方を同時に実行しようとすると失敗します。個別に細かく(ズームまたはスライド)動作させるが、一緒に使用することはできない。

class UnwindScaleSegue: UIStoryboardSegue { 
    override func perform() { 
     scaleDown() 
    } 

    func scaleDown() { 
     let toVC = self.destination 
     let fromVC = self.source  
     let screenHeight = UIScreen.main.bounds.size.height  

     toVC.view.transform = CGAffineTransform.init(translationX: 0.0, y: screenHeight) 
     //toVC.view.transform = CGAffineTransform(scaleX: 0.001, y: 0.001) 

     fromVC.view.superview?.insertSubview(toVC.view, at: 0) 
     UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations: { 
      //fromVC.view.transform = CGAffineTransform(scaleX: 0.001, y: 0.001) 
      fromVC.view.transform = CGAffineTransform.init(translationX: 0.0, y: -screenHeight) 

      toVC.view.transform = CGAffineTransform.identity 
     }, completion: { success in 
      fromVC.dismiss(animated: false, completion: nil) 
     }) 
    } 
} 

答えて

0

解決済み!それは、変換がどのように組み合わされるかと関係していることが分かります。私は理解しているとは確信していませんが、変換のベクトルの性質に関係しているものは、同じアニメーションで複数の変換を行うときは注意が必要です。

これらを「連結」することにより、注意深く動作します。しかし、私にとっては、注文を入れ替えてもうまくいきませんでした。

キー行には星印が付きます。

class UnwindScaleSegue: UIStoryboardSegue { 

    override func perform() { 
     scaleAway() 
    } 

    func scaleAway() { 
     let toVC = self.destination 
     let fromVC = self.source 

     let screenHeight = UIScreen.main.bounds.size.height 

     var translate = CGAffineTransform(translationX: 0.0, y:screenHeight) //** 
     let scale = CGAffineTransform(scaleX: 0.001, y: 0.001) //** 

     toVC.view.transform = scale.concatenating(translate) //** 

     fromVC.view.superview?.insertSubview(toVC.view, at: 0) 

     UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations: { 
      translate = CGAffineTransform(translationX: 0.0, y: -screenHeight) //** 
      fromVC.view.transform = scale.concatenating(translate) //** 

      toVC.view.transform = CGAffineTransform.identity 
     }, completion: { success in 
      fromVC.dismiss(animated: false, completion: nil) 
     }) 
    } 
} 
関連する問題