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("成功回调了")
    }
相关推荐
新缸中之脑33 分钟前
SaaS 大灭绝
开发语言·ios·swift
Swift社区44 分钟前
LeetCode 389 找不同 - Swift 题解
算法·leetcode·swift
二流小码农18 小时前
2026年,在鸿蒙生态里,继续深耕自己
android·ios·harmonyos
2501_9151063218 小时前
iPhone 文件管理,如何进行应用沙盒文件查看
android·ios·小程序·https·uni-app·iphone·webview
符哥20081 天前
iOS 开发中常用的第三方库 / 框架列表
ios
2501_915921431 天前
iOS 抓包怎么绕过 SSL Pinning 证书限制,抓取app上的包
android·网络协议·ios·小程序·uni-app·iphone·ssl
TheNextByte12 天前
如何在 iPad/iPhone 上删除语音邮件?
ios·iphone·ipad
TheNextByte12 天前
如何修复iPhone短信消失问题?
ios·cocoa·iphone
二流小码农2 天前
鸿蒙开发:独立开发者的烦恼之icon图标选择
android·ios·harmonyos
智先森zhi2 天前
实战:将 Android 多Module应用迁移到 kmp+cmp
android·ios·kotlin