Ios SwiftUI-设置从0到x的计数文本动画
我想将默认情况下从0开始的文本设置为变量的动画 例如,对于x=80,我希望我的文本以非常快的速度显示0到80之间的所有数字,直到达到80为止。 我找到了进度指标的例子,但我无法将这些方法应用于此 你对此有什么想法吗Ios SwiftUI-设置从0到x的计数文本动画,ios,swift,swiftui,Ios,Swift,Swiftui,我想将默认情况下从0开始的文本设置为变量的动画 例如,对于x=80,我希望我的文本以非常快的速度显示0到80之间的所有数字,直到达到80为止。 我找到了进度指标的例子,但我无法将这些方法应用于此 你对此有什么想法吗 谢谢,迪奥克拉西斯。您可以使用计时器.Publisher定期触发计数器的递增 若要在达到所需计数后停止递增,每当计时器启动时,您可以检查计数是否已达到结束,如果未达到,则递增,否则删除订阅并停止递增 class Counter: ObservableObject { @Pub
谢谢,迪奥克拉西斯。您可以使用
计时器.Publisher
定期触发计数器的递增
若要在达到所需计数后停止递增,每当计时器
启动时,您可以检查计数
是否已达到结束
,如果未达到,则递增,否则删除订阅并停止递增
class Counter: ObservableObject {
@Published var count = 0
let end: Int
private var timer = Timer.publish(every: 0.5, on: .main, in: .common).autoconnect()
private var subscriptions = Set<AnyCancellable>()
init(end: Int) {
self.end = end
}
func start() {
timer.sink { [weak self] _ in
guard let self = self else { return }
if self.count <=self.end {
self.count += 1
} else {
self.subscriptions.removeAll()
}
}.store(in: &subscriptions)
}
}
struct AnimatedText: View {
@ObservedObject var counter: Counter
var body: some View {
Text("\(counter.count)")
.onAppear() {
self.counter.start()
}
}
}
struct AnimatedText_Previews: PreviewProvider {
static var previews: some View {
AnimatedText(counter: Counter(end: 80))
}
}
类计数器:ObservableObject{
@已发布变量计数=0
让我们结束:Int
private var timer=timer.publish(每隔:0.5,在:.main上,在:.common中)。自动连接()
私有变量订阅=Set()
初始化(结束:Int){
self.end=结束
}
func start(){
timer.sink{[弱自]uuin
guard let self=self-else{return}
如果self.count这里我创建了一个名为runCounter
的小函数,它绑定到计数器
变量、开始
值、结束
值和速度
。调用时,它将绑定的变量设置为开始
值,然后启动一个运行的计时器
每隔速度
秒,递增计数器,直到达到结束
,此时计数器使计时器失效
此独立示例显示两个计数器以不同的速度运行,这两个计数器都在使用.onAppear()
首次出现时启动
struct ContentView:View{
@国家私有变量计数器1=0
@国家私有var计数器2=0
var body:一些观点{
VStack{
文本(“\(self.counter1)”)
奥纳佩尔先生{
self.runCounter(计数器:self.$counter1,开始:0,结束:80,速度:0.05)
}
文本(“\(self.counter2)”)
奥纳佩尔先生{
self.runCounter(计数器:self.$counter2,开始:0,结束:10,速度:0.5)
}
}
}
func运行计数器(计数器:绑定,开始:Int,结束:Int,速度:双精度){
counter.wrappedValue=开始
Timer.scheduledTimer(withTimeInterval:speed,repeats:true){Timer in
counter.wrappedValue+=1
如果counter.wrappedValue==end{
timer.invalidate()
}
}
}
}
struct ContentView: View {
@State private var counter1 = 0
@State private var counter2 = 0
var body: some View {
VStack {
Text("\(self.counter1)")
.onAppear {
self.runCounter(counter: self.$counter1, start: 0, end: 80, speed: 0.05)
}
Text("\(self.counter2)")
.onAppear {
self.runCounter(counter: self.$counter2, start: 0, end: 10, speed: 0.5)
}
}
}
func runCounter(counter: Binding<Int>, start: Int, end: Int, speed: Double) {
counter.wrappedValue = start
Timer.scheduledTimer(withTimeInterval: speed, repeats: true) { timer in
counter.wrappedValue += 1
if counter.wrappedValue == end {
timer.invalidate()
}
}
}
}