2017-05-10 1 views
1

Ich habe eine UIButton, und ich möchte seinen Text ändern, indem Sie auf seine titleLabel Attribut zugreifen. Wie auch immer, die Art, wie ich die Schaltfläche ändern möchte, besteht darin, zuerst auf eine sehr kleine Größe zu verkleinern, dann sofort zu ändern, während sie unsichtbar ist, und dann wieder hochzuskalieren. Nachdem ich hier mehrere Beiträge durchgesehen habe, habe ich folgendes erreicht:Wie animiere ich UILabels Text nach der Verzögerung?

let changeText = CATransition(); 
    changeText.type = kCATransitionReveal; 
    changeText.duration = 0.0; 
    changeText.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionLinear); 
    submitButton.titleLabel?.layer.add(changeText, forKey: "changeTextTransition"); 


    UIView.animateKeyframes(withDuration: 0.6, delay: 0, options: .calculationModeLinear, animations: { 
     //Zzzeeeewwwwwwwwww 
     UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.5, animations: { 
      self.submitButton.titleLabel?.transform = self.submitButton.titleLabel!.transform.scaledBy(x: 0.001, y: 0.001); 
     }) 


     UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.0, animations: { 
      self.submitButton.titleLabel?.text = "Green"; 
     }) 

     //Wwwwwweeeeeeyyyyyppp 
     UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5, animations: { 
      self.submitButton.titleLabel?.transform = self.submitButton.titleLabel!.transform.scaledBy(x: 1000, y: 1000); 
     }) 
    }, completion: nil) 

Das Problem ist, dass dies nicht funktioniert. Was ich bekomme, ist ein kurzes Aufblitzen der Worte "New Text", wenn das Etikett schrumpft, und wenn es wieder skaliert, ist es immer noch "Old Text". Es ist so komisch, dass ich nicht einmal anfangen kann, meinen Kopf einzuwickeln, was die Ursache sein könnte. Ich denke, was passiert, ist, dass es den neuen Übergang auf dem neuen Text spielt, bevor es sich verkleinert (Keine Ahnung, warum, seit ich Dauer = 0 angegeben habe), dann wird der alte Text wieder vergrößert. Hier

ist, wie es aussieht (mit etwas Hintergrundfarbe ändern, die ich oben weggelassen):

Weird Bug

+0

Versuchen Sie, 'fillMode' auf' kCAFillModeBoth' zu setzen. –

+0

Ich weiß, dass dies nicht beantwortet Frage, aber ich habe große Erfahrung mit der Definition komplexer Animationen und Anzeigen von ihnen mit https://github.com/airbnb/lottie-ios. Lottie nimmt eine von https://github.com/bodymovin/bodymovin erstellte JSON-Datei, die auf einer After-Effects-Datei basiert. Auch wenn Sie keine After-Effect-Fähigkeiten haben, können Sie einfache Arbeit wie diese auf fivver getan werden. –

+0

@ JonRose hat nicht funktioniert. Keine Änderung. – QuantumHoneybees

Antwort

2

Zunächst einmal Glückwünsche für einschließlich Soundeffekte in Ihrem Code Kommentare, froh, dass es nicht nur mir, macht das.

Die Texteigenschaft eines Etiketts kann nicht animiert werden, daher wird es sofort angewendet, wodurch Ihre Animation beschädigt wird.

Eine Lösung, die ich für komplexe Animationen verwende, ist die Verwendung von Snapshots. Erstellen Sie zu Beginn der Animation einen Snapshot der Beschriftung, setzen Sie dann das Alpha der Beschriftung auf Null und aktualisieren Sie den Text. Animiere dann die Transformationen von Label und Snapshot zusammen, wenn sie klein sind, mache das Label sichtbar und den Snapshot unsichtbar und animiere dann den Backup.

, die komplizierter klingt, als es ist, hier ist Code, um es auf einem Spielplatz zu laufen:

import UIKit 
import PlaygroundSupport 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400)) 
view.backgroundColor = .blue 
PlaygroundPage.current.liveView = view 

let label = UILabel(frame: CGRect(x: 100, y: 100, width: 200, height: 200)) 
label.text = "Hello" 
label.font = UIFont.systemFont(ofSize: 50) 
label.textAlignment = .center 
label.textColor = .white 
view.addSubview(label) 

let snapshot = label.snapshotView(afterScreenUpdates: true)! 
view.addSubview(snapshot) 
snapshot.frame = label.frame 
label.alpha = 0 
label.text = "Goodbye" 

UIView.animateKeyframes(withDuration: 2, delay: 0, options: [.repeat, .autoreverse], animations: { 
    UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.45) { 
     label.transform = CGAffineTransform(scaleX: 0.01, y: 0.01) 
     snapshot.transform = label.transform 
    } 

    UIView.addKeyframe(withRelativeStartTime: 0.45, relativeDuration: 0.1) { 
     label.alpha = 1.0 
     snapshot.alpha = 0.0 
    } 

    UIView.addKeyframe(withRelativeStartTime: 0.55, relativeDuration: 0.45) { 
     label.transform = CGAffineTransform.identity 
    } 
}) { _ in 
    snapshot.removeFromSuperview() 
} 

Welche Sie dieses Ergebnis gibt:

enter image description here

Es ist mir nicht klar, was Sie versuchen, mit dem CAT-Übergang zu tun - es sei denn, es gibt noch einen anderen Effekt, den du suchst, der deinem Zweck nicht hilft.

+0

Haha, endlich jemand schätzt meine informativen Kommentare !! Anscheinend funktioniert das nicht, wenn meine Ansicht ein 'UIButton' ist. Alles funktioniert perfekt bis zu der Zeile, in der Sie den Text des Buttons/Labels einstellen. Es weist den Text aus irgendeinem Grund nicht der Beschriftung der Schaltfläche zu. – QuantumHoneybees

+0

Ich habe einen Druck (button.titleLabel.text) direkt unter der Zuweisungszeile und es scheint der Text ist immer noch der alte Text. – QuantumHoneybees

+1

Nvm, behoben. Ich musste 'setTitle' anstelle von' button.titleLabel.text' verwenden. Vielen Dank!!!!!! – QuantumHoneybees

Verwandte Themen