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后的晨仔30 分钟前
SwiftUI 完全指南:从声明式 UI 到响应式架构的终点回顾
ios
90后的晨仔31 分钟前
SwiftUI 多线程与并发编程深度总结
ios
90后的晨仔33 分钟前
Combine 与系统框架集成:将响应式编程融入 Apple 生态
ios
90后的晨仔35 分钟前
Combine 与 Swift Concurrency:响应式与并发的完美协奏
ios
90后的晨仔39 分钟前
Combine 自定义 Subject:构建专属的响应式事件源
ios
90后的晨仔42 分钟前
Combine 架构模式:构建响应式应用的蓝图
ios
90后的晨仔1 小时前
Combine 高级实践:多线程调度、调试与测试
ios
人月神话Lee3 小时前
【图像处理】饱和度——颜色的浓淡与灰度化
ios·ai编程·图像识别
王飞飞不会飞4 小时前
iOS卡顿查找和定位-ProFile
ios·性能优化
敲代码的鱼4 小时前
NFC读卡能力 支持安卓/iOS/鸿蒙 UTS插件
android·ios·uni-app