Swift UI ile bir Metinden diğerine geçişi nasıl canlandırabilirim?

Dec 14 2020

Bir dizi dizim var. Örneğin["Car", "Boat", "Van"]

Dizideki metnin (daha fazla dize içerebilir) değişimini, geçişi bulanıklaştırarak Cargeçmesi Boatiçin nasıl anime edebilirim Van? Ve böylece sürekli olarak bunu döngüye sokuyor?

Nasıl canlandırılacağına dair bir fikrim var, ancak metni değiştirmekte sıkışıp kaldım. Metnin neden buraya geçmediği sorusunu sordum -> Neden bu SwiftUI görünümünde metin değil de boyut canlandırılıyor?

Ama metnin nasıl değiştirileceğine dair ayrı bir soru yazmanın daha iyi olacağını düşündüm.

Yanıtlar

2 davidev Dec 14 2020 at 07:57

Burada, bir diziye dayalı olarak metni canlandıran olası bir çözüm bulunmaktadır. Bu çözümden Asperis geçiş fikrini burada kullandım

struct ContentView: View {
    var array = ["First", "Second", "Third"]
    @State var shortString = true
    
    @State var currentIndex : Int = 0
    @State var firstString : String = ""
    @State var secondString : String = ""

    var body: some View {

        VStack {
            if shortString {
               Text(firstString).font(.title).fixedSize()
               .transition(AnyTransition.opacity.animation(.easeInOut(duration:1.0)))
            }
            if !shortString {
                Text(secondString).font(.title).fixedSize()
                    .transition(AnyTransition.opacity.animation(.easeInOut(duration:1.0)))
            }
        }
        .animation(.default)
        .onAppear {
            firstString = array[0]
            secondString = array[1]
            
            let timer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { _ in
                if (shortString) {
                    if currentIndex == array.count - 1 {
                        self.secondString = array[0]
                        currentIndex = 0
                    }
                    else {
                        self.secondString = array[currentIndex+1]
                        currentIndex += 1
                    }
                }
                else {
                    if currentIndex == array.count - 1 {
                        self.firstString = array[0]
                        currentIndex = 0
                    }
                    else {
                        self.firstString = array[currentIndex+1]
                        currentIndex += 1
                    }
                }
                shortString.toggle()
            }
        }
    }
}
Justacoder Dec 14 2020 at 09:02

@Davidev cevabını zaten seçtim. Ama onun cevabına göre uyguladığım şey buydu. Şerefe 🍺

struct ContentView: View {
    var array = ["First", "Second", "Third"]
    @State var currentIndex : Int = 0
    @State var firstString : String = ""
    @State var timer: Timer? = nil
    @State var isBlurred = false
    
    var body: some View {
        VStack {
            Text(firstString).blur(radius: isBlurred ? 6 : 0)
        }.onAppear {
            self.timer = newTimer
        }
    }
    
    var newTimer: Timer {
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { v in
            let rndTime = [0.5, 0.3, 0.7, 1.0].randomElement()! // I wanted a random time up to 1 second.
            v.invalidate()
            currentIndex += 1
            if currentIndex == array.count { currentIndex = 0 }
            DispatchQueue.main.asyncAfter(deadline: .now() + rndTime) {
                self.isBlurred.toggle()
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                    self.isBlurred.toggle()
                    firstString = array[currentIndex]
                    self.timer = newTimer
                }
            }
        }
    }
}