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("成功回调了")
    }
相关推荐
2501_916008892 小时前
ChatGPT前端开发学习指南:Visual Studio Code与谷歌浏览器安装配置详解
ide·vscode·ios·小程序·uni-app·编辑器·iphone
MonkeyKing3 小时前
iOS 图片内存优化实战:解码、downSample、纹理内存与大图展示全解析
ios
00后程序员张5 小时前
iOS开发中Xcode安装不完整问题解决方案与配置指南
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
sakiko_5 小时前
Swift学习笔记26-使用第三方库
笔记·学习·swift
2501_915909065 小时前
完整指南:如何将iOS应用上架到App Store
android·ios·小程序·https·uni-app·iphone·webview
90后的晨仔5 小时前
SwiftUI 高级依赖注入:构建可测试、可扩展应用的基石
ios
90后的晨仔5 小时前
SwiftUI 中的 Combine:响应式编程完全指南
ios
pop_xiaoli14 小时前
【iOS】RunLoop
macos·ios·objective-c·cocoa
区块block17 小时前
iOS 27 重磅开放:第三方 AI 模型自由切换,苹果生态告别封闭
人工智能·ios
人月神话Lee20 小时前
【图像处理】亮度与对比度——图像的线性变换
ios·ai编程·图像识别