UIView.animate() 无法为视图设置动画的各种原因都有哪些?

Posted

技术标签:

【中文标题】UIView.animate() 无法为视图设置动画的各种原因都有哪些?【英文标题】:What are various reasons why UIView.animate() would fail to animate a view?UIView.animate() 无法为视图设置动画的各种原因有哪些? 【发布时间】:2020-11-13 05:16:31 【问题描述】:

对于我的一生,我无法弄清楚为什么我的视图不会动画,所以我想可能是因为一些我不知道的奇怪原因。有没有人对为什么UIView.animate() 无法正确设置动画的不太常见的方式有任何想法?我用来动画视图的方法是:

func animateView() 
    print("1")
    UIView.animate(withDuration: 5.0, delay: 2.0, options: [], animations: 
        self.viewToAnimate.alpha = 0.0
        print("2")
    , completion: _ in
        print("3")
    )

更奇怪的是(在我看来),当我运行时,控制台输出

1
2
3

立即,并且不考虑 2.0 秒的延迟或 5.0 秒的持续时间...看起来我的“动画”是瞬时的,使我的视图立即消失,alpha 为 0。

有什么想法吗?

【问题讨论】:

您需要提供minimal reproducible example,即从“在 Xcode 中创建新项目”开始,向我们提供重现问题的步骤列表。 @Sweeper 问题是,我的项目并不小,而且我真的不知道要包括什么(因为我不知道失败可能在哪里)。我似乎无法复制失败。这就是为什么我要寻求人们可以提出的通用想法……常见的陷阱领域。 好吧,Stack Overflow 帮不了你。学习使用分而治之的方法来隔离问题。 我想我会尽力而为......我猜没有什么奇怪的原因它不起作用? @Eric - 您是否更改了您的 print() 声明以确认?正如我所说,如果要设置动画的目标属性 - 在这种情况下为 .alpha - 已经相等(即已经为 0),则持续时间 都是延迟将被忽略。另一点:如果在调用animateView() func 之前代码中的某处有UIView.setAnimationsEnabled(false),那么再一次,没有延迟或持续时间。您确实需要在代码中向后工作,并在执行之前弄清楚发生了什么。 【参考方案1】:

以下是我能想到的原因:

1-您可以检查您的设备设置常规->辅助功能->视觉->减少运动

2- 你可以检查你调用的代码中是否有任何地方UIView.setAnimationsEnabled(false)https://developer.apple.com/documentation/uikit/uiview/1622420-setanimationsenabled

3- 在视图上调用动画之前,尝试在视图上调用 layoutIfNeeded。这与动画的工作方式有关,它需要初始状态和结束状态,然后将两种状态之间的差异投射到时间图上。 https://www.objc.io/issues/12-animations/animations-explained/

4- 您没有在主线程上调用该方法,这会使它变得奇怪。尝试在 dispatch_main 块中调用它

【讨论】:

感谢您的回复!这很奇怪,因为稍后不同的动画可以正常工作。另外,如果我使用的是 UIView.animate 或 CABasicAnimation,#3 是否适用? ios 上的所有动画都使用 Core Animation 运行。 UIKit 的基于块的动画方法只是一个方便的功能。 我接受了您的回答,因为它是最有帮助的——谢谢!不幸的是,我被禁止再问任何问题,因为显然我的问题没有得到足够的正面投票:/

以上是关于UIView.animate() 无法为视图设置动画的各种原因都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

当使用 UIView.animate 动画视图时,其他视图也不需要动画

UIView.animate with repeat 选项在新的 View Controller 出现时停止

视图唤醒时 UIView.animate() 冻结

UIView.animate 没有完美地动画布尔值

视图框架的 UIView.animate 问题

如何在tableview上方隐藏自定义视图