You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIViewPropertyAnimator异步addCompletion方法使用疑问及代码改写求助

解决UIViewPropertyAnimator异步Completion警告问题

在Task中使用UIViewPropertyAnimator的addCompletion(_:)方法时,会触发「Consider using asynchronous alternative function」警告。虽然系统提供了异步替代方法addCompletion() async -> UIViewAnimatingPosition,但该方法无法传入自定义完成代码块,导致后续逻辑无法直接嵌入。

原示例代码(存在警告):

override func viewDidLoad() {
    super.viewDidLoad()
    Task {
        UIViewPropertyAnimator.runningPropertyAnimator(
            withDuration: 2,
            delay: 2,
            options: [],
            animations: {
                self.view.alpha = 0
            }
        ).addCompletion { [weak self] _ in
            self?.view.alpha = 1
        }
    }
}

解决方案

利用异步版本的addCompletion(),通过await等待动画完成后,直接在Task的后续代码中执行完成逻辑,既满足视图先消失再重现的需求,又消除警告:

override func viewDidLoad() {
    super.viewDidLoad()
    Task {
        let animator = UIViewPropertyAnimator.runningPropertyAnimator(
            withDuration: 2,
            delay: 2,
            options: [],
            animations: {
                self.view.alpha = 0
            }
        )
        // 等待动画完成,获取动画结束位置
        _ = await animator.addCompletion()
        // 动画结束后执行视图重现操作
        self.view.alpha = 1
    }
}

补充说明

  • await animator.addCompletion()会暂停当前Task,直到动画执行完成,替代了原闭包的等待逻辑。
  • 如果需要根据动画结束的不同状态(如正常完成/被打断)做区分处理,可以使用返回的UIViewAnimatingPosition参数进行判断:
    let position = await animator.addCompletion()
    switch position {
    case .end:
        self.view.alpha = 1
    case .start, .current:
        // 处理动画未正常完成的情况
        break
    }
    

内容的提问来源于stack exchange,提问作者matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:54:57