完成块内的 UIViewPropertyAnimator 状态?

Posted

技术标签:

【中文标题】完成块内的 UIViewPropertyAnimator 状态?【英文标题】:UIViewPropertyAnimator state inside completion block? 【发布时间】:2021-10-23 23:28:15 【问题描述】:

玩 UIViewPropertyAnimator,我遇到了一个奇怪的问题。

这里,

    let animator = UIViewPropertyAnimator(duration: 1, curve: .linear)
    animator.addAnimations(someAnimationBlock)
    
    animator.addCompletion position in
                    
    switch position
    
            case .current:
                        print("is current")
            case .start:
                        print("is start")
            case .end:
                        print("is end")
    
                        print(self.animator.state == .active)
                        print(self.animator.state == .inactive)
                        print(self.animator.state == .none)
                        print(self.animator.state == .stopped)
                        
    


animator.startAnimation()

这段代码运行后,这会到达.end position 的完成块,但对于动画师来说,所有状态都是错误的。为什么会这样?

据我所知,随着动画自然完成,它应该处于.inactive 状态。

P.s 我在完成块中试图触发 animator.startAnimation() 并且完成块不再被调用。我知道startAnimation() 仅在animator's 状态为.inactive 时有效。所以在这里我测试了,我没有收到任何状态值,需要帮助!

【问题讨论】:

如果你在debugPrint(self.animator.state).end 中得到什么? 它将打印'__C.UIViewAnimatingState'。如果我 debugPrint(self.animator.state.rawValue) 它打印'5',根据苹果文档 UIViewAnimatingState 是一个符合 int 的枚举,并具有三种情况,即活动、非活动和停止,其值分别为 0,1 和 2。我不明白为什么这个打印 5 不应该是这样。 【参考方案1】:

当动画的完成块被调用并且位置为.end时,动画已经完全完成,很快就会从视图中移除。

即使您再次调用startAnimation 也不会产生效果,因为无论如何动画很快就会消失。

您可以在视图上创建新动画并启动它们,而不是从完成块中调用startAnimation

【讨论】:

Scott 我的目标是:将 UIViewPropertyAnimator 设置为 isReversed = true -> 向 animator 对象添加完成块(用于在动画完成时设置 isReversed = false) Scott 我对 UIViewPropertyAnimator 的某些行为有点不清楚,如果您能澄清一些概念,我将非常感谢。我可能会有更多关于 UIViewPropertyAnimator 的问题。我可以有你的推特,以便我可以通知你吗?

以上是关于完成块内的 UIViewPropertyAnimator 状态?的主要内容,如果未能解决你的问题,请参考以下文章

更改完成块内的属性值

使用swift更改动画块内的UIbutton

如何等待Jenkinsfile“并行”块内的所有执行程序?

描述块内的 jest.setTimeOut() 是不是仅将超时应用于描述块内的测试

jsdoc @ 代码块内的字符

C#:锁块内的多个线程