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("成功回调了")
    }
相关推荐
DeyouKong2 小时前
Go反射-通过反射调用结构体的方法(带入参)
开发语言·ios·golang
Ya-Jun6 小时前
性能优化实践:启动优化方案
android·flutter·ios·性能优化
桌角的眼镜12 小时前
模拟开发授权平台
macos·ios·xcode
程序务虚论1 天前
抓取工具Charles配置教程(mac电脑+ios手机)
macos·ios·https·charles
帅次1 天前
Flutter BottomNavigationBar 详解
android·flutter·ios·小程序·iphone·reactnative
明似水1 天前
解决 Flutter 在 iOS 真机上构建失败的问题
flutter·ios
前后端杂货铺2 天前
uniapp利用生命周期函数实现后台常驻示例
android·前端·ios·微信小程序·uni-app
安和昂2 天前
iOS 类与对象底层原理
macos·ios·cocoa
吉凶以情迁2 天前
c# window桥接mac电脑直接开发ios直接win开发运行 弹出模拟器
macos·ios
前后端杂货铺2 天前
uniapp+vue3+ts 使用canvas实现安卓端、ios端及微信小程序端二维码生成及下载
android·前端·ios·微信小程序·uni-app·canavas·二维码海报生成