前提・実現したいこと
macOS用アプリを作っています。
文章が8秒おきに切り替わるようにしました。
その文章が切り替わるときに、フェードイン、またはフェードアウトするようにしたいのです。
つまり、前の文章が消える→前の文章から次の文章に切り替わる(消えているので見えない)→次の文章が現れる、という順番に処理することで、見た目では前の文章がフェードアウトした後に次の文章がフェードインするようにしたいのです。
試したこと
Swift
1struct ContentView: View { 2 private let timer = Timer.publish(every: 8, on: .main, in: .default).autoconnect() 3 @State var textOpacity: Double = 1 4 @State var textIndex: Int = 0 5 let textArray: [String] = ["Hello, world!", "こんにちは"] 6 var body: some View { 7 VStack { 8 Text(textArray[textIndex]) 9 .opacity(textOpacity) 10 .onReceive(timer){_ in 11 withAnimation(.linear(duration: 2.0)){ 12 textOpacity = 0 13 } 14 withAnimation(.linear(duration: 0).delay(2.5)){ 15 if(textIndex == 0){ 16 textIndex = 1 17 } else{ 18 textIndex = 0 19 } 20 } 21 withAnimation(.linear(duration: 2.0).delay(3.0)){ 22 textOpacity = 1 23 } 24 } 25 } 26 } 27}
フェードイン、フェードアウトはopacityを0または1に変えることで実現しました。
.onReceiveのところで8秒おきに
2秒かけて消える→2.5秒目に文章が変わる→3.0秒目から2秒かけて現れる
となるようにしたつもりです。
しかし、実際にbuildすると
文章が変わる→消える→現れる
の順番になりました。
アドバイスよろしくお願いいたします。
文章が切り替わる時にフェードイン、フェードアウトが起きるようにできるならば、どんな方法でも用いたいです。
このコードの改良版はもちろん助かりますし、withAnimationやTimerなどを使わない方法でも教えていただけると大変有難いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/26 10:46