【问题标题】:How can I use a CAMediaTimingFunction to map a custom value?如何使用 CAMediaTimingFunction 映射自定义值?
【发布时间】:2012-08-10 11:22:30
【问题描述】:

我想使用 CAMediaTimingFunction(例如 kCAMediaTimingFunctionEaseIn)将输入值 (0-1) 映射到输出值 (0-1),就像 the docs 说这个类一样。但是,此功能似乎根本没有公开。

有什么方法可以让我为自己的自定义值访问此功能?这不在 UIView、CALayer 等中 - 它只是在一些我想使用 iOS 曲线的自定义代码中。

【问题讨论】:

    标签: objective-c ios animation timing


    【解决方案1】:

    这就是你需要的:https://stackoverflow.com/a/19084008/251440

    我自己需要它,所以构建了一个类,其接口和功能与CAMediaTimingFunction 完全相同,但需要-valueForX: 方法。

    【讨论】:

    • 好东西。在阅读了 Webkit 源代码后,我最终做了一些非常相似的事情。希望他们只是把它放在 iOS API 中,会节省很多重复。
    【解决方案2】:

    实际上,该功能是唯一公开的功能。 CAMediaTimingFunction 是一个类,它存储定义从 (0.0,0.0) 开始到 (1.0,1.0) 结束的 Bézier 曲线的两个控制点的坐标。这样的曲线实际上是区间[0,1]到区间[0,1]的映射。

    如果您想了解如何设置特定曲线的控制点坐标,您可能需要在 Google 上搜索什么是贝塞尔曲线。

    附录:

    正如您所阐明的,您希望使用现有的 CAMediaTimingFunction 实例来执行从值到转换后的值的映射(也就是计算映射)。您可以使用 getControlPointAtIndex:values: 从实例中检索控制点的坐标,并使用它们来计算映射。有关数学,请参阅 http://en.wikipedia.org/wiki/Bézier_curve

    【讨论】:

    • 感谢您的快速答复!我必须在这里遗漏一些明显的东西。我所追求的是能够传递 0 到 1 之间的时间值并获得 0 到 1 之间的输出值,该输出值沿着预定义曲线之一移动,例如kCAMediaTimingFunctionEaseIn。我看到我可以使用 'functionWithName' 方法来创建 CAMediaTimingFunction 实例,但是我应该使用什么函数将输入值映射到输出值?我对创建自己的曲线不感兴趣,我只想使用 kCAMediaTimingFunctionEaseIn。
    • @antsyawn - 你知道怎么做吗?谢谢。
    • @SpaceDog - 是的,当我评论接受的答案时,我在某处的 webkit 源代码中找到了我所追求的方法。抱歉,这是很久以前的事了,我不再拥有代码,但效果很好。祝你好运:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2015-10-20
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多