Ich bin neu in der iPhone- und Mac-Programmierung (zuvor für Windows entwickelt) und habe eine Frage:
Wie animiere ich die text
Eigenschaft einer UILabel
zwischen zwei Zahlen, z. B. von 5 bis 80, in einem Ease-Out-Stil? Ist es möglich mit CoreAnimation
? Ich habe eine Stunde lang bei Google gesucht, aber nichts gefunden, was mein Problem lösen könnte. Was ich will: Animieren Sie das Geld der Benutzer für ein einfaches Spiel. Es sieht nicht sehr gut aus, wenn es nur von 50 auf 100 geht oder so etwas ohne Animation.
Hat jemand eine Idee, wie das geht?
Vielen Dank!
Antworten:
Sie können die automatischen Übergänge verwenden. Es funktioniert perfekt:
// Add transition (must be called after myLabel has been displayed) CATransition *animation = [CATransition animation]; animation.duration = 1.0; animation.type = kCATransitionFade; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [myLabel.layer addAnimation:animation forKey:@"changeTextTransition"]; // Change the text myLabel.text = newText;
Dieser Code funktioniert, wenn myLabel bereits angezeigt wird. Wenn nicht, ist myLabel.layer gleich Null und die Animation wird dem Objekt nicht hinzugefügt.
in Swift 4 wäre das:
let animation: CATransition = CATransition() animation.duration = 1.0 animation.type = kCATransitionFade animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) myLabel.layer.add(animation, forKey: "changeTextTransition")
quelle
removedOnCompletion
umNO
auf die InstanzCATransition
, jede Änderung des Labelstext
wird animiert werden.changeTextTransition
. Es ist einfach eine Zeichenfolge, die die Animation identifiziert. Dies bedeutet, dass Sie diese Zeichenfolge später verwenden können, um eine zuvor hinzugefügte Animation zu identifizieren. Wenn Sie Ihre Animation später nicht identifizieren müssen, können Sie sie einfach angebennil
.Es funktioniert gut!
Ziel c
[UIView transitionWithView:self.label duration:.5f options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionTransitionCrossDissolve animations:^{ self.label.text = rand() % 2 ? @"111!" : @"42"; } completion:nil];
Swift 2
UIView.transitionWithView(label, duration: 0.25, options: [.CurveEaseInOut, .TransitionCrossDissolve], animations: { self.label.text = (arc4random() % 2 == 0) ? "111" : "222" }, completion: nil)
Swift 3, 4, 5
UIView.transition(with: label, duration: 0.25, options: [.curveEaseInOut, .transitionCrossDissolve], animations: { self.label.text = (arc4random() % 2 == 0) ? "111" : "222" }, completion: nil)
quelle
image
von aUIImageView
Ich habe eine großartige Engine zum Tweening von Werten mit einer Vielzahl verschiedener Timing-Funktionen namens PRTween gefunden . Installieren Sie die Klassen und erstellen Sie Code in dieser Richtung:
- (IBAction)tweenValue { [[PRTween sharedInstance] removeTweenOperation:activeTweenOperation]; PRTweenPeriod *period = [PRTweenPeriod periodWithStartValue:0.0 endValue:100.0 duration:1.0]; activeTweenOperation = [[PRTween sharedInstance] addTweenPeriod:period target:self selector:@selector(update:) timingFunction:&PRTweenTimingFunctionCircOut]; } - (void)update:(PRTweenPeriod*)period { self.animatingView.center = CGPointMake(period.tweenedValue + 100.0, 200.0); self.valueLabel.text = [NSString stringWithFormat:@"%.2f", period.tweenedValue]; }
Arbeitet ein Vergnügen für mich. :) :)
quelle
Wenn Sie möchten, dass es mit der neuen Nummer auf und ab zählt und die vorherige Nummer wegschiebt (wie ein Ticker oder so):
let animation = CATransition() animation.removedOnCompletion = true animation.duration = 0.2 animation.type = kCATransitionPush animation.subtype = newValue > value ? kCATransitionFromTop : kCATransitionFromBottom animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) valueLabel.layer.addAnimation(animation, forKey:"changeTextTransition")
quelle
Verwenden Sie in Swift 2.0 die folgende
UIView.transitionWithView()
Methode:UIView.transitionWithView(self.payPeriodSummaryLabel, duration: 0.2, options: [.CurveEaseInOut, .TransitionCrossDissolve], animations: { () -> Void in self.label.text = "your text value" }, completion: nil)
quelle
eine andere einfache Alternative
extension UILabel { func countAnimation(upto: Double) { let from: Double = text?.replace(string: ",", replacement: ".").components(separatedBy: CharacterSet.init(charactersIn: "-0123456789.").inverted).first.flatMap { Double($0) } ?? 0.0 let steps: Int = 20 let duration = 0.350 let rate = duration / Double(steps) let diff = upto - from for i in 0...steps { DispatchQueue.main.asyncAfter(deadline: .now() + rate * Double(i)) { self.text = "\(from + diff * (Double(i) / Double(steps)))" } } } }
quelle