Swift UI ile bir Metinden diğerine geçişi nasıl canlandırabilirim?
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 Car
geçmesi Boat
iç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
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()
}
}
}
}
@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
}
}
}
}
}