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("成功回调了")
    }
相关推荐
shadowcz00710 小时前
苹果不卷AI了:iOS 27要让第三方模型“竞标“进系统
人工智能·ios
90后的晨仔10 小时前
Combine 错误处理与恢复:构建健壮的应用防线
ios
90后的晨仔10 小时前
Combine 多线程与调度器:掌控数据流的执行线程
ios
冰凌时空11 小时前
iOS 架构模式全景图:MVC / MVVM / VIPER / Clean Architecture 选型指南
ios·openai·ai编程
冰凌时空11 小时前
Swift 类型系统入门:从 Int、String 到自定义类型
前端·ios·ai编程
pop_xiaoli1 天前
【iOS】autoreleasePool
ios·objective-c·cocoa
秋雨梧桐叶落莳1 天前
iOS——ZARA仿写项目
学习·macos·ios·objective-c·cocoa
人月神话Lee1 天前
【图像处理】二值化与阈值——从灰度到黑白的决策
ios·ai编程·图像识别
美狐美颜SDK开放平台1 天前
美颜SDK接入流程详解:Android、iOS、鸿蒙兼容方案解析
android·人工智能·ios·华为·harmonyos·美颜sdk·视频美颜sdk
90后的晨仔1 天前
Combine 操作符 —— 打造强大的数据处理管道
ios