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("成功回调了")
    }
相关推荐
终端安全笔记3 小时前
绕过工具把 iOS 27 列进支持范围:从它的更新节奏能读出什么
安全·ios
AIsoft_86893 小时前
线上培训录屏怎么转文字?科会通操作指南
ios·智能手机
weixin_403810137 小时前
苹果脚本编写软件有哪些?怎么选择 iOS脚本技术路线
ios
2501_915918411 天前
在 Xcode 中运行和调试单元测试的完整指南
ide·vscode·macos·ios·单元测试·个人开发·xcode
茉莉玫瑰花茶1 天前
GO [ 标准库 · HTTP 高可用 ]
ios·iphone·xcode
用户1202687863861 天前
过审了,国区搜不到
ios
用户38034165882971 天前
八个私有 SPM 包撑起六款 App:分支当版本、钻石依赖,和一次谁都没报错的失效
ios·swift
老李IT笔记1 天前
远程取设备日志:iOS、tvOS 和 macOS 三端的同意方式不一样
macos·ios
茶底世界之下1 天前
食物照片有点偏绿?用 Awaking 把色调往回调一点
ios