Tengo un contador de dinero que aumenta con el tiempo que quiero animar, estoy usando la extensión a continuación para ejecutar la animación, pero el problema es que anima toda la etiqueta cuando solo quiero que los dígitos que están cambiando se animen.

Pensé que dividiría los dígitos y animaría cada dígito individualmente, el problema es que no puedo entender cómo desglosar el número y obtener dígitos específicos.

¿Hay alguna manera de desglosar el número y obtener los dígitos individuales o una mejor manera de ejecutar la animación en números individuales?

 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()
        }
3
Mick 15 feb. 2017 a las 14:54

2 respuestas

La mejor respuesta

En primer lugar, desea utilizar NumberFormatter en lugar de una simple interpolación de cadenas, para asegurarse de tener siempre el número correcto de decimales y signos de moneda, etc. para su configuración regional / moneda. Luego, todo lo que necesita hacer es mapear la propiedad .characters de la Cadena de nuevo en una matriz de cadenas:

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"]
}

Muchas gracias a @Sulthan por señalar que mi primera respuesta con String(format: "$%0.2f", dollars) fue shoddy :)

2
Grimxn 15 feb. 2017 a las 12:40

Esa es en realidad una animación más complicada y no creo que sea posible lograr eso con solo una etiqueta. Mi idea sería reemplazar su etiqueta actual con una vista de pila horizontal. Si su número es, digamos 100.00 $, luego agregue 7 etiquetas a la pila, cada una con solo un dígito (incluyendo "," y "$"). Ahora, cada vez que cambie su valor actual, todo lo que tiene que hacer es averiguar cuál de los dígitos ha cambiado. Para eso, puede comparar los caracteres antes de cambiar el valor, con los caracteres después de cambiar el valor. Los caracteres son una propiedad de cada cadena. Ahora que sabe qué valores cambiar, puede iterar sobre todas las subvistas en su pila, animando cada uno de los dígitos por separado. Lo sé, es una jerarquía de vista mucho más complicada, pero los resultados serán buenos.

0
Florensvb 15 feb. 2017 a las 12:15