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
相关产品推荐
相关产品推荐

