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("成功回调了")
    }
相关推荐
秋雨梧桐叶落莳28 分钟前
iOS——NSUserDefaults学习
学习·macos·ios·objective-c·cocoa
2601_955767422 小时前
iPhone 17 OLED 屏幕偏振光学分析 & AR 镀膜与双护技术实践解析
人工智能·科技·ios·iphone·圆偏振光
大熊猫侯佩3 小时前
WWDC26 前瞻:苹果可能放出的“王炸”,不只是 Siri
xcode·swift·wwdc
人月神话Lee5 小时前
【图像处理】颜色空间——RGB之外的世界
ios·ai编程·图像识别
用户029669769826 小时前
微信iPad协议的消息加密与安全传输机制
ios
开开心心loky6 小时前
[OC 底层] (五) iOS 中常见的几种锁
macos·ios·cocoa
看谷秀11 小时前
swift part 6 三方库综合
swift
库奇噜啦呼12 小时前
【iOS】源码学习-SDWebImage源码学习
学习·ios
zuYM4g7Dp13 小时前
文顶顶iOS开发数据库篇—SQL
数据库·sql·ios
超梦dasgg13 小时前
APP 壳、加固、脱壳 完整通俗讲解(安卓为主,兼顾 iOS)
android·ios