在任何时间点获取 CABasicAnimation 中扩展圆圈的大小

Posted

技术标签:

【中文标题】在任何时间点获取 CABasicAnimation 中扩展圆圈的大小【英文标题】:Get size of an expanding circle in a CABasicAnimation at any point in time 【发布时间】:2011-04-13 03:08:14 【问题描述】:

我想知道如何在动画过程中的任何时间点获取扩张圈动画的直径(或半径)。我也会在获得大小后立即停止动画,但我想我无法停止并将其从图层中移除,直到获得圆圈的大小。

关于如何实现扩展圆圈动画的示例,它是iPhone Quartz2D render expanding circle 问题答案中addGrowingCircleAtPoint:(CGPoint)point 方法中显示的实现的变体。

我尝试检查图层、动画等的各种值,但似乎找不到任何东西。我认为更糟糕的情况是,我可以尝试通过将当前时间放入其动画中来做出最佳猜测,并根据其往返大小状态使用它来确定它“应该”在哪里。这似乎有点矫枉过正,因为我认为这是一个在我可以轻松获得的地方增加的值。

更新:

我已经在表示层上尝试了几个属性,包括似乎永远不会改变的变换,所有值总是相同的,无论检查时圆圈的大小如何。

【问题讨论】:

【参考方案1】:

好的,这就是您如何在动画制作时获取动画的当前状态。

当 Rob 接近时,他遗漏了两条关键信息。

首先,您必须从 layer.presentationLayer.subLayers 获取要制作动画的图层,对我而言,这是唯一可用的子图层。

其次,从这个子层你不能直接访问转换,你必须通过 valueForKeyPath 来获取 transform.scale.x。我用 x 是因为它是一个圆,x 和 y 是一样的。

然后我使用它来根据用于创建弧的值来计算圆的大小。

【讨论】:

+1 这很有用。我不清楚“不能直接访问转换”是什么意思。你是说 -transform 和 -valueForKey:@"transform" 返回不同的东西吗?还是您的意思是使用 KVC 调用来达到规模更方便?【参考方案2】:

我假设你想要得到的是当前的CATransform3D,并且从中你可以得到你的圈子大小。

你想要的是layer.presentationLayer.transform。有关presentationLayer 的详细信息,请参阅CALayer 文档。另请参阅Core Animation Rendering Architecture。

【讨论】:

我在调试模式下用断点查看了它,我没有看到任何提供当前圆圈大小的东西,实际上在变换上暴露的东西很少。什么属性或方法为我提供了直径或半径?当失败时,我尝试在presentationLayer上使用值,例如边界宽度,但它始终为0。您在谈论哪个“层”是UIView或我在创建和启动动画的方法中创建的CAShapeLayer的一部分?我是否需要将转换转换为 CATransform3D 或其他? 不会有任何变量包含“当前半径”。您正在将一个圆圈绘制到一个图层中,然后您正在使用变换缩放该图层。您将通过应用当前比例因子来计算当前半径。如果您不了解转换,您可能需要备份并确保您了解您复制的代码。从阅读核心动画编程指南开始。 developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 你在居高临下和自以为是。而不是提供 *** 所提供的快速帮助,而是说“我知道怎么做,但我不会告诉你,因为我花时间通过阅读和上学来学习,而显然你只是一个白痴,复制代码,所以我只会指向您阅读材料而不回答您的问题。”你不认识我,什么都不感谢。我对动画和转换“足够了解”以理解代码示例,但我仍在学习中,我希望能从 SO 获得一些快速帮助来解决问题。 注明。您的后续问题似乎没有表现出对核心动画编程指南的熟悉,并且缺乏这使得快速回答比有用更危险。您自己发布的答案很有见地且很有帮助,因此恭喜您完成了它。很抱歉我的指点对此没有帮助。

以上是关于在任何时间点获取 CABasicAnimation 中扩展圆圈的大小的主要内容,如果未能解决你的问题,请参考以下文章

在任何地方的 maximo 中获取数组 indexoutofbound 异常

Flutter 从 Api 获取 Userinfo 并在任何地方使用。请帮我

JabbR 代码库是不是记录在任何地方?

定义类时自动注册(但无需在任何地方导入)

在任何地方使用我的 AsyncTask 类中的变量

未在任何地方引用的 Vue 计算属性