You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何实现文本淡入完成后触发缩放退出过渡

SwiftUI实现文本淡入后触发缩放退出过渡

问题描述

在SwiftUI视图中已实现初始显示第一个文本,几秒后第一个文本淡出、第二个文本淡入的效果。需求为:第二个文本(Text("HELLO FROM THE OTHER SIDE"))淡入完成后,延迟几秒触发自定义的TextZoomOutTransition缩放退出过渡。

修改后的完整代码

import SwiftUI

struct Transitions: View {
    // 修正@State变量语法:添加private修饰符并初始化默认值
    @State private var changeText = false
    @State private var zoomText = false

    private var textFadeOut: AnyTransition {
        .opacity
        .animation(.easeOut(duration: 0.3))
    }
    
    private var textFadeIn: AnyTransition {
        .opacity
        .animation(.easeIn(duration: 0.3))
    }
    
    private var textZoomOutTransition: AnyTransition {
        .asymmetric(
            insertion: .opacity,
            removal: .scale(scale: 1000, anchor: UnitPoint(x: 0.5, y: 0.45))
                .animation(.easeInOut(duration: 2.0).delay(0.1))
        )
    }
    
    public var body: some View {
        ZStack(alignment: .center) {
            Color.clear
            
            VStack(spacing: 24) {
                if !changeText {
                    Text("HELLO THERE")
                        .transition(textFadeOut)
                } else if !zoomText {
                    // 为第二个文本绑定缩放退出过渡
                    Text("HELLO FROM THE OTHER SIDE")
                        .transition(textZoomOutTransition)
                }
            }
        }
        .onAppear {
            zoomText = false
            // 1秒后切换至第二个文本(触发淡入动画)
            DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
                changeText = true
            }
            // 第二个文本淡入完成后停留3.7秒(总时长5秒),触发缩放退出
            DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
                zoomText = true
            }
        }
    }
}

// 预览视图
struct Transitions_Previews: PreviewProvider {
    static var previews: some View {
        Transitions()
    }
}

关键修改说明

  • 修正@State变量语法:原代码缺少private修饰符和默认初始化值,Swift要求@State变量必须初始化,添加private符合封装原则。
  • 绑定缩放过渡到第二个文本:将第二个文本的过渡从textFadeIn替换为textZoomOutTransition,这样当zoomText变为true时,会触发该过渡的移除动画(即缩放退出效果)。
  • 调整触发时机:原代码设置的5秒延迟已包含“第一个文本显示1秒→第二个文本淡入0.3秒→停留3.7秒”的逻辑,刚好满足需求;若需调整停留时长,修改第二个asyncAfter的延迟数值即可。
  • 统一命名规范:将过渡变量名改为小驼峰格式(如textFadeOut),符合Swift命名习惯。

内容的提问来源于stack exchange,提问作者stefanosn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:25:29