首页 > 解决方案 > 原生布局系统正在动画化

问题描述

我最近遇到了一个所有布局都动画的问题。我不知道是什么原因造成的。欢迎任何关于如何检测问题来源的想法。

控制器层次结构:

可见的动画内容:(不在动画块内)

布局和样式代码在哪里? 首先在数据源观察者之后viewDidLoad和内部didSet

线程呢? 我仔细检查了在主队列中调度的所有 UI 工作并Main Thread Checker处于打开状态。

- 给我看代码!!!

不幸的是,这是一个史诗般的生产项目,导致此问题的更改是UNKNOWN. 我无法在某些演示应用程序中重现该问题以发布它。对不起

标签: iosswiftanimationlayout

解决方案


经过大约 3 天的调查后,我发现了这个问题,并在几分钟内得到了答案:

在代码的某些地方有一个动画块:

UIView.animate(withDuration: 1, animations: {
    self.view.layoutIfNeeded()
})

我不知道为什么,但这会导致所有布局在控制器的余生中都动画化(即使在动画完成之后)

所以为了解决这个问题,我尝试了这个:

UIView.animate(withDuration: 1, animations: {
    DispatchQueue.main.async {
       self.view.layoutIfNeeded()
    }
})

问题解决了但是!!!新问题出现: 原版动画完全不行!

因此,对于最终的解决方法,我稍微更改了代码:

DispatchQueue.main.async {
    UIView.animate(withDuration: 1, animations: {
       self.view.layoutIfNeeded()
    })
}

幸运的是它有效!我知道:

所有 UI 工作都应该在主线程上完成

并且动画块不会捕获自我,并在当前线程上执行它们的工作。但奇怪的是。


推荐阅读