何时在自定义 UIVIew 中添加 CAAnimation?
Posted
技术标签:
【中文标题】何时在自定义 UIVIew 中添加 CAAnimation?【英文标题】:When to add CAAnimation in a custom UIVIew? 【发布时间】:2018-05-27 20:14:05 【问题描述】:问题:只有当我在 viewWillAppear 或更高版本中添加视图时,我的自定义 UIView 动画才会显示。
上下文:在我的自定义 UIView 中,我在自定义初始化函数中创建动画并将其添加到图层。
override init(color: UIColor)
backgroundPulsatingDotView = RouteIndicatorDotView(color: color)
super.init(colour: color)
configureBackgroundPulsatingDot()
addPulsatingAnimation()
这个自定义 UIView 位于视图层次结构的深处,理想情况下,我的视图控制器不应该仅仅因为这个动画而关心自己触发动画或触发在 viewWillAppear 中添加视图 [除了使用 viewWillAppear 时出现的其他错误或添加子视图的后期阶段]
有没有办法在我的自定义视图中保持添加和启动动画的逻辑,而不需要来自外部方的触发器,它会说“嘿,现在视图可见,请为自己设置动画”?
或者我应该在我的自定义视图生命周期中的何处添加动画的添加和启动,以使其在视图控制器生命周期中正常工作?
【问题讨论】:
我通常只是将我的动画放在viewDidAppear
/willDisplay(cell:_)
等中,然后添加一个布尔值来告诉我是否应该再次为它制作动画。
【参考方案1】:
有没有办法在我的自定义视图中保持添加和启动动画的逻辑,而不需要来自外部方的触发器,它会说“嘿,现在视图可见,请为自己设置动画”?
在视图成为应用程序视图层次结构的一部分并且最初绘制之前,没有任何动画可以制作。在那之前你不能制作动画。这就是为什么向您发送标记视图生命阶段的事件,以便您可以将代码放在 right 方法中,该方法将在视图中的正确时间运行循环。 init
是 错误 方法。现在还为时过早。
尝试覆盖另一个生命周期方法 - 可能类似于 layoutSubviews
(但请注意:这可能会被多次调用,因此您需要使用 Bool 标志以便仅在第一次启动动画)。
还请注意,即使那样,您也无法一次性添加点并开始对其进行动画处理。添加后,您必须等待重绘时刻过去,然后才能开始对其进行动画处理。我通常做的是在很短的延迟后跳到主线程,以便我的动画代码在当前 CATransaction 提交后运行。
【讨论】:
有时我的印象是您在堆栈上不停在线:D。我猜这没有简单的解决方案...我想知道是否有任何干净的方法可以通过创建自定义层并监听其委托方法来做到这一点... 我认为您应该坚持使用基于视图的方法。视图获取各种有用的生命周期事件(当我们被添加到超级视图时,当我们被添加到窗口时,当我们重绘时,当我们进行布局时,等等)。一层没有。 developer.apple.com/documentation/uikit/uiview/…以上是关于何时在自定义 UIVIew 中添加 CAAnimation?的主要内容,如果未能解决你的问题,请参考以下文章
如何借助 AutoLayout 在自定义 UITableviewCell 中添加自定义 UIView(xib)?
在自定义 UIView 中为部分自动调整 UITableView