2017-02-15 58 views
3

我有一個隨着時間的推移而增加的錢櫃臺,我想動畫,我使用下面的擴展來運行動畫,但問題是它動畫整個標籤,當我只想要數字正在改變成動畫。獲取一個特定的小數位

我想我會將數字分開並動畫每個單獨的數字,問題是我無法計算如何分解數字並獲取特定數字。

有沒有辦法讓我打破數字並獲得單個數字或更好的方式在單個數字上運行動畫?

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屬性映射回字符串數組:

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

非常感謝@Sulthan您指出我的第一個答案用String(format: "$%0.2f", dollars)僞劣 :)

+0

@Sulthan - 你當然是對的! – Grimxn

+0

然後我只是從數組中拉出單個項目並將它們添加到標籤中? – Mick

+0

是的 - 我回答你的觀點「我不知道如何分解數字並得到特定的數字」。我假設動畫你可能需要每個數字一個標籤... – Grimxn

0

這實際上是一個更棘手的動畫,我不認爲這是可能實現只用一個標籤。我的想法是用水平堆棧視圖替換當前的標籤。如果您的電話號碼是100.00 $,那麼在堆疊中添加7個標籤,每個標籤只顯示一個數字(包括「,」和「$」)。現在,只要您當前的值發生變化,您所要做的就是找出哪些數字發生了變化。爲此,您可以在更改值之前將字符與更改值後的字符進行比較。這些字符是每個字符串的屬性。現在您知道要更改哪些值,您可以遍歷堆棧中的所有子視圖,並分別爲每個數字設置動畫。我知道,這是一個更復雜的視圖層次結構,但結果會很好。

相關問題