Ios SwiftUI-设置从0到x的计数文本动画

Ios SwiftUI-设置从0到x的计数文本动画,ios,swift,swiftui,Ios,Swift,Swiftui,我想将默认情况下从0开始的文本设置为变量的动画 例如,对于x=80,我希望我的文本以非常快的速度显示0到80之间的所有数字,直到达到80为止。 我找到了进度指标的例子,但我无法将这些方法应用于此 你对此有什么想法吗 谢谢,迪奥克拉西斯。您可以使用计时器.Publisher定期触发计数器的递增 若要在达到所需计数后停止递增,每当计时器启动时,您可以检查计数是否已达到结束,如果未达到,则递增,否则删除订阅并停止递增 class Counter: ObservableObject { @Pub

我想将默认情况下从0开始的文本设置为变量的动画

例如,对于x=80,我希望我的文本以非常快的速度显示0到80之间的所有数字,直到达到80为止。 我找到了进度指标的例子,但我无法将这些方法应用于此

你对此有什么想法吗


谢谢,迪奥克拉西斯。

您可以使用
计时器.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()
            }
        }
    }
}