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("成功回调了")
    }
相关推荐
systeminof2 小时前
iOS 26.4 更新前瞻:Siri 架构级重构与上线时间预测
ios·重构
刮涂层_赢大奖14 小时前
我给MAC做了一个 Windows 任务栏,用了之后再也回不去 Dock 了
windows·macos·ios
疯笔码良1 天前
【swiftUI】实现自定义的底部TabBar组件
ios·swiftui·swift
松叶似针2 天前
Flutter三方库适配OpenHarmony【secure_application】— iOS 端原生模糊遮罩实现分析
flutter·ios·cocoa
vx-bot5556662 天前
企业微信ipad协议的会话管理机制与本地同步策略
ios·企业微信·ipad
阿捏利2 天前
详解Mach-O(十三)Mach-O __TEXT
macos·ios·c/c++·mach-o
pop_xiaoli2 天前
effective-Objective-C 第三章阅读笔记
笔记·ios·objective-c
东坡肘子2 天前
祝大家马年新春快乐! -- 肘子的 Swift 周报 #123
人工智能·swiftui·swift
BatmanWayne2 天前
swift微调记录
微调·swift