【问题标题】:Native layout system is animating原生布局系统正在动画化
【发布时间】:2019-10-06 01:24:15
【问题描述】:

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

控制器层次结构:

  • UITabBar 控制器
    • UINavigationControler
      • UIViewController
      • UIPageViewController
        • UICollectionView
        • 谷歌地图

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

  • 布局:
    • 标签和视图在单元格中移动到目标位置(自行调整大小的单元格)
    • 水平集合视图项目来自角落到它们的位置
  • 层:
    • 圆角半径从 0 到 height/2 动画。
  • 查看:
    • isHidden 有时不起作用。它在UIStackView 内部,当隐藏它时,它只是将它从堆栈视图中推出(由于错误而可见,奇怪但确实如此)
    • 设置动画按钮的标题(setTitle:forState: 方法。而不是闪烁动画,某种变形动画)

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

线程呢? 我仔细检查了主队列中调度的所有 UI 工作,Main Thread Checker 已打开。

- 给我看代码!!!

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

【问题讨论】:

  • 有时是因为您使用了另一个窗口。有时因为代码在另一个线程上。但是既然你说你已经检查了主线程,我很想看看是什么导致了这个奇怪的 iOS 错误。
  • 不,它不在另一个窗口中。
  • 动画什么时候出现?它们对应一个事件吗?它们是同时发生的吗?
  • 同时在一起。每次布局系统发生变化时,例如 stackview 子视图的可见性,或适合的标签大小,或集合视图单元格自我调整大小等。

标签: ios swift animation layout


【解决方案1】:

经过大约 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 工作都应该在主线程上完成

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多