【问题标题】:How to specify an beginTime for an animation by using CFTimeInterval?如何使用 CFTimeInterval 为动画指定 beginTime?
【发布时间】:2009-07-22 16:09:54
【问题描述】:

就我的理解而言,beginTime 可以用来表示“嘿,正好在 12:00 点开始”。但是我如何用 CFTimeInterval 类型来说明这一点?我以为这无非是一种“浮点”值来指定秒数。

或者与 CAMediaTiming 协议中指定的 timeOffset 属性有何不同?

【问题讨论】:

    标签: ios iphone cocoa-touch uikit core-animation


    【解决方案1】:

    我在文档中错过的内容:beginTime 位于“核心动画绝对时间”中,因此您必须获取当前时间并指定您的偏移量:

    // Start in 5 seconds
    theAnimation.beginTime = CACurrentMediaTime() + 5;
    

    【讨论】:

    • beginTime 在父时间空间中指定,而不是相对于绝对时间。
    • @an0,显然,就我而言,父时间空间与 CACurrentMediaTime() 相同,所以它工作得很好。你会如何引用父时间空间?
    • 我们应该以图层时间空间中的当前时间——直接添加到图层的动画的父时间空间——为基础。如果图层的 beginTime 设置为非零,您的代码将无法工作。详情见我的回答。
    【解决方案2】:

    你首先需要像这样转换到图层的时间空间

    let currentLayerTime = myLayer.convertTime(CACurrentMediaTime(), from: nil)
    

    然后您可以将beginTime 设置为相对于图层的现在时间。例如,让动画在 2 秒内开始:

    myAnimation.beginTime = currentLayerTime + 2
    

    您可能还希望将fillMode 设置为.backwards,以便在添加动画之前设置最终属性值:

    myAnimation.fillMode = .backwards
    myLayer.someProperty = someFinalValue
    myLayer.addAnimation(myAnimation, forKey: "myAnimationName")
    

    【讨论】:

    • 太棒了,let currentLayerTime = myLayer.convertTime(CACurrentMediaTime(), from: nil) 如此重要,因为CACurrentMediaTime() 可能不那么精确
    【解决方案3】:

    不,这不是 beginTime 所做的。它指定其父动画的相对开始时间(默认情况下,组中的多个动画同时触发)。

    来自documentation

    指定开始时间 接收者与其父母的关系 对象(如果适用)。

    timeOffset 导致它在将在 offSet 时间所在的帧处开始动画,当它到达结尾时,它会循环播放。换句话说,假设 A、B、C、D、E 是动画帧,如果您将 beginTime 或 timeOffset 设置为正常情况下点击帧 C 时的值,则会在各种情况下发生这种情况。

    Normal      |A->B->C->D->E
    beginTime:  |      A->B->C->D->E
    timeOffset: |C->D->E->A->B
    

    【讨论】:

    • 只设置timeOffset不会延迟动画和改变初始时间。你的'timeOffset'行真的是你设置'timeOffset'和'beginTime'会发生什么......对吗?
    • Louis,你知道是否有办法只运行动画,如:部分:| - - A->B->C,所以与你提到的 beginTime 情况基本相同,但它在到达结束时停止而不是让它循环?
    • 像@LouisGerbarg 一样工作。谢谢
    【解决方案4】:

    我认为 CAMediaTiming 协议的文档非常糟糕。 Time Warp in Animation 是对 CAMediaTiming 协议所有属性的详尽解释(重新文档化)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多