2017-02-15 26 views
3

私はアニメートしたい時間が経つにつれて増加するマネーカウンターを持っていますが、アニメーションを実行するのに以下のエクステンションを使用していますが、問題は、アニメーション化されるように変化しています。特定の小数点以下の桁を取得する

数字を分割してそれぞれの数字を独自にアニメーション化したと思っていましたが、問題を解決する方法がわかりません。

私は数字を壊して個々の数字を取得する方法や、個々の数字でアニメーションを実行するより良い方法がありますか?実際にはもっとトリッキーアニメーションだと、私はそれだけで1つのラベルでそれを達成することが可能だとは思わない

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

答えて

2

まず、単純な文字列補間ではなく、NumberFormatterを使用して、ロケール/通貨の通貨記号などの小数点以下の桁数が常に正しいことを確認します。そして、すべてを行う必要が戻って文字列の配列に文字列の.charactersプロパティをマッピングされています。私の最初の答えはString(format: "$%0.2f", dollars)を使用していることを指摘し@Sulthanに

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

多くのおかげで見掛け倒し :)

ました
+0

@Sulthan - あなたはもちろん、正解です! – Grimxn

+0

そして、私は配列から個々のアイテムを取り出し、それらをラベルに追加します。 – Mick

+0

はい - 私はあなたの意見に答えていました。「番号を分解して特定の数字を取得する方法はわかりません。私はあなたが1桁あたり1つのラベルが必要かもしれないアニメーションを想定しています... – Grimxn

0

。私の考えは、現在のラベルを水平のスタックビューに置き換えることです。あなたの数字が100.00 $としましょう。次に、スタックに7個のラベルを追加します。それぞれのラベルは "、"と "$"を含みます。今現在の値が変わるたびに、変更された桁がどれかを調べるだけです。そのため、値を変更する前に文字を比較し、値を変更した後に文字を比較することができます。文字はすべての文字列のプロパティです。変更する値を知ったので、スタック内のすべてのサブビューを繰り返し処理し、各数字を別々にアニメーション化することができます。わかりました、それははるかに複雑なビュー階層ですが、結果は素晴らしいでしょう。

関連する問題