2017-12-14 2 views
1

Es gibt viele ausgezeichnete Antworten zu diesem Thema, aber dieses hat mich verwirrt.Benutzerdefinierte Segu, mehrere nicht synchronisierende Animationen

Es gibt zwei auskommentierte Zeilen, die nicht richtig zu funktionieren scheinen. Ich möchte, dass dieses benutzerdefinierte Segment sowohl gleiten und schrumpfen, so dass der Effekt für die fromVC verschwindet in nichts und die kommen von nichts von unten.

Wenn ich jedoch versuche, beides gleichzeitig zu tun, schlägt es fehl. Entweder einzeln gut funktionieren (ein Zoom oder eine Folie), aber nicht zusammen.

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) 
     }) 
    } 
} 

Antwort

0

Gelöst! Es stellt sich heraus, dass es damit zu tun hat, wie die Transformationen kombiniert werden. Ich bin mir nicht sicher, ob ich das verstehe, aber etwas, das mit der Vektornatur der Transformationen zu tun hat, bedeutet, dass Sie vorsichtig sein müssen, wenn Sie mehrere Transformationen in derselben Animation durchführen.

Durch "Verketten" sie sorgfältig, es funktioniert! Für mich jedoch, wenn ich die Bestellung getauscht habe, hat es nicht funktioniert.

Die Schlüsselzeilen sind markiert.

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) 
     }) 
    } 
} 
Verwandte Themen