Swift withAnimation 动画完成监听

在ios17中withAnimation有completion方法可以监听动画完成,但是低于ios17没有,需要自定义一个监听器,原理就是通过AnimatableModifier可以监听到值的didSet修改,我们就可以调用回调函数。

代码

swift 复制代码
// 动画完成监听
struct AnimatableCompletionModifier<Value>: AnimatableModifier where Value: VectorArithmetic {
    var animatableData: Value {
        didSet {
            notifyCompletionIfFinished()
        }
    }

    private var targetValue: Value
    private var completion: () -> Void

    init(observedValue: Value, completion: @escaping () -> Void) {
        self.completion = completion
        animatableData = observedValue
        targetValue = observedValue
    }

    private func notifyCompletionIfFinished() {
        guard animatableData == targetValue else { return }
        DispatchQueue.main.async {
            self.completion()
        }
    }

    func body(content: Content) -> some View {
        return content
    }
}

extension View {
    func onAnimationCompleted<Value: VectorArithmetic>(for value: Value, completion: @escaping () -> Void) -> ModifiedContent<Self, AnimatableCompletionModifier<Value>> {
        modifier(AnimatableCompletionModifier(observedValue: value, completion: completion))
    }
}

使用

swift 复制代码
Text("回调")
    .opacity(introTextOpacity)
    .onAnimationCompleted(for: introTextOpacity) {
        print("成功回调了")
    }
相关推荐
90后的晨仔9 小时前
第5章:基础状态管理
ios
90后的晨仔9 小时前
第4章:基础布局系统
ios
90后的晨仔10 小时前
第3章:基础视图组件
ios
Digitally15 小时前
iTunes 无法连接到此 iPhone - 9 种解决方法
ios·iphone
2501_9160074718 小时前
iOS逆向工程:详细解析ptrace反调试机制的破解方法与实战步骤
android·macos·ios·小程序·uni-app·cocoa·iphone
REDcker18 小时前
Safari 26.4 新增 WebTransport:对 iOS WebView 的影响与落地建议
前端·ios·safari
00后程序员张19 小时前
前端可视化大屏制作全指南:需求分析、技术选型与性能优化
前端·ios·性能优化·小程序·uni-app·iphone·需求分析
产品人卫朋20 小时前
硬件产品分析:Selfix背屏手机壳 - iPhone 17 Pro的后摄自拍救星?
ios·智能手机·iphone
REDcker1 天前
iOS 与 Android:浏览器引擎、WebView 与生态差异概览
android·ios·内核·浏览器·webview
美狐美颜sdk1 天前
视频平台如何实现实时美颜?Android/iOS直播APP美颜SDK接入指南
android·前端·人工智能·ios·音视频·第三方美颜sdk·视频美颜sdk