何时在自定义 UIVIew 中添加 CAAnimation?

When to add CAAnimation in a custom UIVIew?

问题:只有当我在 viewWillAppear 或更高版本中添加视图时,我的自定义 UIView 动画才会显示。

上下文:在我的自定义 UIView 中,我在自定义初始化函数中创建动画并将其添加到图层。

override init(color: UIColor) {
    backgroundPulsatingDotView = RouteIndicatorDotView(color: color)

    super.init(colour: color)

    configureBackgroundPulsatingDot()

    addPulsatingAnimation()
}

这个自定义 UIView 位于视图层次结构的深处,理想情况下,我的视图控制器不应该仅仅因为这个动画而自行触发动画或触发在 viewWillAppear 中添加视图 [除了使用时出现的其他错误viewWillAppear 或添加子视图的后续阶段]

有没有一种方法可以在我的自定义视图中保持添加和启动动画的逻辑,而不需要来自外部方的触发器 "hey now the view is visible, please animate yourself"?

或者我应该在我的自定义视图生命周期中的什么地方添加动画的添加和开始,以使其与视图控制器生命周期一起正常工作?

Is there a way to still keep the logic of adding and starting the animation inside my custom view without needing a trigger from an external party which would say "hey now the view is visible, please animate yourself"?

在视图成为应用程序 视图层次结构 的一部分并且最初绘制之前,没有任何动画。在那之前你不能制作动画。这就是为什么您会收到标记视图生命阶段的 events 的原因,这样您就可以将代码放在 right 方法中,该方法将 运行 在视图的喜欢周期中的正确时间。 init错误的方法。现在还为时过早。

尝试重写另一个生命周期方法——也许类似于 layoutSubviews(但要注意:这可以被调用多次,所以你需要使用 Bool 标志,这样你只在第一次启动动画).

另请注意,即使那样,您也无法添加点并开始一次性动画化。添加它之后,您必须等待重绘时刻过去,然后才能开始对其进行动画处理。我通常做的是在非常短的延迟后进入主线程,以便我的动画代码在当前 CATransaction 提交后 运行s。