Here's an example where you can input a String. It will turn it into an array of Strings (for each character), add them onto the screen using an HStack and Text objects. Each Text has initial .opacity of 0.0 and then a function is called that will loop through each Text, turning the .opacity to 1.0.
struct CharView: View {
var characterArray: [String]
@State var characterLoopIndex: Int = -1
let loopDuration: Double = 0.5
init(input: String) {
characterArray = input.map { String($0) }
}
var body: some View {
HStack(spacing: 0) {
ForEach(characterArray.indices) { index in
Text("\(characterArray[index])")
.opacity(characterLoopIndex >= index ? 1 : 0)
.animation(.linear(duration: loopDuration))
}
}
.onAppear(perform: {
startCharacterAnimation()
})
}
func startCharacterAnimation() {
let timer = Timer.scheduledTimer(withTimeInterval: loopDuration, repeats: true) { (timer) in
characterLoopIndex += 1
if characterLoopIndex >= characterArray.count {
timer.invalidate()
}
}
timer.fire()
}
}
Usage:
CharView(input: "This is a test string")