2017-02-15 6 views
3

Ich habe einen Geldzähler, der im Laufe der Zeit zunimmt, die ich animieren möchte, verwende ich die unten genannte Erweiterung, um die Animation auszuführen, aber das Problem ist, dass es das gesamte Etikett animiert, wenn ich nur die Ziffern möchte die sich ändern, um animiert zu werden.Ermitteln einer bestimmten Dezimalstelle

Ich dachte, ich würde die Ziffern aufteilen und jede einzelne Ziffer von selbst animieren, das Problem ist, dass ich nicht herausfinden kann, wie man die Zahl aufschlüsselt und bestimmte Ziffern bekommt.

gibt es eine Möglichkeit, die Nummer zu brechen und die einzelnen Ziffern oder eine bessere Art der Animation auf einzelne Zahlen zu bekommen?

func pushTransition(duration:CFTimeInterval) { 
    let animation:CATransition = CATransition() 
    animation.timingFunction = CAMediaTimingFunction(name: 
     kCAMediaTimingFunctionEaseInEaseOut) 
    animation.type = kCATransitionPush 
    animation.subtype = kCATransitionFromTop 
    animation.duration = duration 
    self.layer.add(animation, forKey: kCATransitionPush) 
} 



if let aLabel = self.money{ 
     aLabel.pushTransition(duration: 0.2) 
     aLabel.text = "$\(strRoundDollars)" 
     money.sizeToFit() 
     } 

Antwort

2

Erstens möchten Sie lieber NumberFormatter statt einfache String-Interpolation, um sicherzustellen, dass Sie immer die richtige Anzahl an Dezimalstellen & Währungszeichen, etc. für Ihre Ländereinstellung/Währung haben. Dann alles, was Sie tun müssen, ist die Karte .characters Eigenschaft des String zurück in ein Array von Strings:

let dollars = 123.4 
let n = NumberFormatter() 
n.numberStyle = .currency 
n.locale = Locale.autoupdatingCurrent // or whatever locale you want 
if let text = n.string(from: NSNumber(value: dollars)) { 
    text // "$123.40" 
    let charactersAsStrings = text.characters.map({String($0)}) 
    charactersAsStrings // ["$", "1", "2", "3", ".", "4", "0"] 
} 

Vielen Dank an @Sulthan für den Hinweis auf, dass meine erste Antwort String(format: "$%0.2f", dollars) mit war schlampige :)

+0

@Sultan - Sie sind natürlich richtig! – Grimxn

+0

Und dann ziehe ich einfach die einzelnen Elemente aus dem Array und füge sie zu einem Etikett hinzu? – Mick

+0

Ja - ich habe Ihren Punkt beantwortet. "Ich kann mir nicht vorstellen, wie ich die Nummer aufschlüsseln und bestimmte Ziffern erhalten soll." Ich nehme an, für die Animation benötigen Sie möglicherweise ein Etikett pro Ziffer ... – Grimxn

0

das eigentlich eine komplizierte Animation ist, und ich glaube nicht, dass es möglich ist, dass man mit nur Etikett zu erreichen. Meine Idee wäre, Ihr aktuelles Etikett durch eine horizontale Stapelansicht zu ersetzen. Wenn Ihre Zahl beispielsweise 100,00 $ ist, fügen Sie dem Stapel 7 Etiketten hinzu, die jeweils nur eine Ziffer anzeigen (einschließlich "," und "$"). Jetzt, wenn sich Ihr aktueller Wert ändert, müssen Sie nur herausfinden, welche der Ziffern sich geändert hat. Dazu können Sie die Zeichen vor dem Ändern des Wertes mit den Zeichen vergleichen, nachdem Sie den Wert geändert haben. Die Zeichen sind eine Eigenschaft jeder Zeichenfolge. Jetzt, da Sie wissen, welche Werte geändert werden sollen, können Sie über alle Teilansichten in Ihrem Stapel iterieren, wobei Sie jede Ziffer einzeln animieren. Ich weiß, es ist eine viel kompliziertere Ansichtshierarchie, aber die Ergebnisse werden nett sein.

Verwandte Themen