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("成功回调了")
    }
相关推荐
denggun123457 小时前
ios开发逆向安全防抓包
安全·ios
JQShan10 小时前
同步的 defer,异步的陷阱:Swift 并发中加载动画关不掉的调试实录
性能优化·swift
JQShan10 小时前
Swift 多线程通关指南:从 GCD 回调地狱到 Task/Actor 躺赢
swift
Kyln.Wu14 小时前
【python实用小脚本-292】[HR揭秘]手工党点名10分钟的终结者|Python版Zoom自动签到+名单导出加速器(建议收藏)
开发语言·python·swift
大熊猫侯佩18 小时前
Swift 6.2 列传(第十四篇):岳灵珊的寻人启事与 Task Naming
swift·编程语言·apple
大熊猫侯佩18 小时前
SwiftUI 涨知识:如何按条件动态切换 Toggle 视图的样式(.button 或 .switch)
swiftui·swift·apple
Digitally19 小时前
如何在Windows 10 PC上获取 iPhone短信
ios·iphone
脾气有点小暴20 小时前
uv-drop-down-popup 在 iOS 真机中随屏幕滚动偏移
ios·uniapp·uv
2501_9240641120 小时前
2025年移动应用渗透测试流程方案及iOS与Android框架对比
android·ios
tangweiguo0305198720 小时前
Objective-C 核心语法深度解析:基本类型、集合类与代码块实战指南
开发语言·ios·objective-c