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

Posted

技术标签:

【中文标题】当使用 UIView.animate 动画视图时,其他视图也不需要动画【英文标题】:When animating view with UIView.animate other views are also needlessly animated 【发布时间】:2018-06-07 11:09:41 【问题描述】:

我想知道为什么我的自定义 TableViewCells 中的视图会受到动画的影响,而动画应该只为浮动寻呼机中的 2 个视图设置动画(这甚至不在 TableView 的视图层次结构中。..

UIView.animate(withDuration: 0.3) 
    self.stateIndicator.isHiddenInStackView = true
    self.loaderIndicator.isHiddenInStackView = false

当我注释掉动画块时,一切都会停止动画。

附加的 GIF 描述了所有内容(蓝色视图获得动画角半径,徽章“飞入”而不是仅仅出现):

UIView.animate 奇怪的行为

任何帮助或提示将不胜感激:)。

问候汤姆。

【问题讨论】:

什么是isHiddenInStackView?该属性的设置器是否在做某事? 它只是“安全隐藏取消隐藏” var isHiddenInStackView: Bool get return isHidden set if isHidden != newValue isHidden = newValue “错误是隐藏和显示视图在堆栈视图中是累积的。奇怪的 Apple 错误。来源:***.com/a/45599835/9413528 我不认为这个错误是相关的。它只是说您必须多次设置isHidden 才能产生影响。 我的猜测是,由于您的寻呼机正在获取有关表格视图的数据,它可能会以某种方式触发表格视图重新加载。如果该表重新加载是由分页器间接触发的,那么它的更改可能会被动画块捕获。 @ABeard89 在表格视图从后台线程获取更多数据后,我正在更新寻呼机。所以 pager 对表格视图根本不做任何事情。 【参考方案1】:

在块中写下你不想动画的东西

  UIView.performWithoutAnimation 
     //Write your code here
  

【讨论】:

成功了,但我还是不明白为什么会这样?现在我不得不在很多地方使用 performWithoutAnimation.. 有时会发生,假设您正在制作动画,并且在提交该动画之前启动了另一个 UI 操作,该操作将由于该动画块而自动制作动画 谢谢你的帮助,我会坚持下去的。【参考方案2】:

我在主队列中制作我的动画并且它有效。 例如

DispatchQueue.main.async 
     //Write animation code here

【讨论】:

以上是关于当使用 UIView.animate 动画视图时,其他视图也不需要动画的主要内容,如果未能解决你的问题,请参考以下文章

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

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

UIView.animate 不在一个功能上制作动画

在视图控制器之间切换时,图像旋转动画会加速吗

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

NSLayoutConstraint 不使用 UIView.animate 进行动画处理