我有一个货币计数器随着时间的推移而增加,我想动画,我使用下面的扩展来运行动画,但问题是当我只想要改变的数字时,它会动画整个标签动画。
我想我会把数字分开并自己动画每个数字,问题是我无法弄清楚如何分解数字并得到具体的数字。
有没有办法可以打破数字并获得个别数字或更好的方式在个别数字上运行动画?
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()
}
答案 0 :(得分:2)
首先,您要使用your_shape_field
而不是简单的字符串插值,以确保始终具有正确的小数位数和数字。您的区域设置/货币的货币符号等。然后你需要做的就是将String的shape
属性映射回一个字符串数组:
NumberFormatter
非常感谢@Sulthan指出我使用.characters
的第一个答案是劣质:)
答案 1 :(得分:0)
这实际上是一个更棘手的动画,我认为只用一个标签就可以实现这一点。我的想法是用水平堆栈视图替换当前标签。如果您的号码是100.00 $,那么在堆栈中添加7个标签,每个标签只显示一位数(包括“,”和“$”)。现在,只要当前值发生变化,您所要做的就是找出哪些数字已经改变。为此,您可以在更改值之前比较字符与更改值后的字符。字符是每个字符串的属性。现在您知道要更改哪些值,您可以迭代堆栈中的所有子视图,分别为每个数字设置动画。我知道,这是一个更复杂的视图层次结构,但结果会很好。