获取一个特定的小数位
问题描述:
我有一个随着时间的推移而增加的钱柜台,我想动画,我使用下面的扩展来运行动画,但问题是它动画整个标签,当我只想要数字正在改变成动画。获取一个特定的小数位
我想我会将数字分开并动画每个单独的数字,问题是我无法计算如何分解数字并获取特定数字。
有没有办法让我打破数字并获得单个数字或更好的方式在单个数字上运行动画?
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()
}
答
首先,您希望使用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)
是伪劣 :)
答
这实际上是一个更棘手的动画,我不认为这是可能实现只用一个标签。我的想法是用水平堆栈视图替换当前的标签。如果您的电话号码是100.00 $,那么在堆叠中添加7个标签,每个标签只显示一个数字(包括“,”和“$”)。现在,只要您当前的值发生变化,您所要做的就是找出哪些数字发生了变化。为此,您可以在更改值之前将字符与更改值后的字符进行比较。这些字符是每个字符串的属性。现在您知道要更改哪些值,您可以遍历堆栈中的所有子视图,并分别为每个数字设置动画。我知道,这是一个更复杂的视图层次结构,但结果会很好。
@Sulthan - 你当然是对的! – Grimxn
然后我只是从数组中拉出单个项目并将它们添加到标签中? – Mick
是的 - 我回答你的观点“我不知道如何分解数字并得到特定的数字”。我假设动画你可能需要每个数字一个标签... – Grimxn