ios - 原生布局系统正在动画化
问题描述
我最近遇到了一个所有布局都动画的问题。我不知道是什么原因造成的。欢迎任何关于如何检测问题来源的想法。
控制器层次结构:
- UITabBarController
- UI导航控制器
- UIViewController
- UIPageViewController
- UICollectionView
- 谷歌地图
- UI导航控制器
可见的动画内容:(不在动画块内)
- 布局:
- 跨单元格移动到目标位置的标签和视图(自调整单元格)
- 水平集合视图项目来自角落到它们的位置
- 层:
- 角半径从 0 到
height/2
动画。
- 角半径从 0 到
- 看法:
- isHidden 有时不起作用。它在里面
UIStackView
,什么时候隐藏它,它只是将它从堆栈视图中推出(由于错误而可见,奇怪但这是真的) - 在按钮上设置标题动画(
setTitle:forState:
方法。而不是闪烁的动画,某种变形动画)
- isHidden 有时不起作用。它在里面
布局和样式代码在哪里?
首先在数据源观察者之后viewDidLoad
和内部didSet
线程呢?
我仔细检查了在主队列中调度的所有 UI 工作并Main Thread Checker
处于打开状态。
- 给我看代码!!!
不幸的是,这是一个史诗般的生产项目,导致此问题的更改是UNKNOWN
. 我无法在某些演示应用程序中重现该问题以发布它。对不起
解决方案
经过大约 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 工作都应该在主线程上完成
并且动画块不会捕获自我,并在当前线程上执行它们的工作。但奇怪的是。
推荐阅读
- javascript - 在grapesjs Modal中跟踪一个按钮的点击事件
- groovy - 将“ANSI”编码文件写入磁盘
- javascript - 将回调函数传递给子组件,不是函数错误
- apache-spark - 线程“主”java.lang.UnsupportedClassVersionError 中的异常:org/apache/spark/launcher/Main
- facebook - 不使用 Facebook Login 登录多个网站的 Facebook 网站应用
- outlook-addin - 适用于 MAC 的 OnSend 的可用性?
- python-3.x - 如何获得熊猫的每日平均测量值
- documentation - 带有函数签名的 pyomo 文档
- r - 使用 ggplot() 在边框中重新创建 visreg() 数据刻度
- c# - Razor 复选框在 ASP.Net Core 2.2 MVC 中总是返回 false