【问题标题】:How to custom UIViewAnimationCurve like CAMediaTimingFunction's functionWithControlPoints如何像 CAMediaTimingFunction 的 functionWithControlPoints 一样自定义 UIViewAnimationCurve
【发布时间】:2012-03-28 10:01:03
【问题描述】:

UIViewAnimationCurve只有

  • UIViewAnimationCurveEaseInOut
  • UIViewAnimationCurveEaseIn
  • UIViewAnimationCurveEaseOut
  • UIViewAnimationCurveLinear

这些功能。

但是,我需要 UIView 的 ExpoOutBackInOut 动画。

像 ExpoOut 一样是[CAMediaTimingFunction functionWithControlPoints:0.12 :0.51 :-0.4 :1];

我用过CABasicAnimation,但是它不能像UIView动画那样改变frame,改变view size的时候很糟糕。

或者,你有没有更好的方法来改变视图框架,而不是像放大一样。

谢谢。

【问题讨论】:

    标签: objective-c ios animation core-animation uiviewanimation


    【解决方案1】:

    这里的一个问题是不可能为基于 UIView 的动画指定计时函数。据我所知,您将面临一系列令人不快的选择:

    • 切换到使用基于 CALayer 的动画 - 如果代理设置为视图,则动画不会发生,这是一个严重的问题。由于这是 UIView 所必需的,因此这是一个没有吸引力的选项。
    • 将父层添加到您的视图中,并为该层设置动画 - 同样严重的问题是该层将不在笔尖中,对笔尖的修改可能会无意中破坏动画。
    • 不要使用自定义计时功能。

    我在制作动画之前将代理设置为 nil 并在之后立即设置回 UIView,但感觉很脏。不过,我可能会遗漏一些东西。我的代码如下所示:

    - (void)methodThatAnimates {
        [CATransaction begin]; {
            /* Must set to nil, otherwise the view just jumps to the new location. */
            self.viewToAnimate.layer.delegate = nil;
    
            CAMediaTimingFunction *timingFunction = 
                [CAMediaTimingFunction functionWithControlPoints:0.4 :0 :0 :1.0];
            [CATransaction setAnimationTimingFunction:timingFunction]
            self.viewToAnimate.layer.position = CGPoint(15.0, 0.0);
    
            /* Set delegate back to the view, as is required per the 
               Apple documentation. */
            self.viewToAnimate.layer.delegate = self.viewToAnimate;
        } [CATransaction commit];
    }
    

    到目前为止,它似乎是一种魅力,但我一直期待着一些奇怪的神器出现,因为代理暂时为零。

    【讨论】:

      【解决方案2】:

      您可能想看看MTAnimation。它是一个 UIView 类别,提供类似 jQuery 的计时功能。

      【讨论】:

        【解决方案3】:

        具有媒体计时功能的选项数量有限。您可以使用您列出的标准,或为三次贝塞尔曲线提供几个控制点。但是,您生成的曲线不能生成小于 0 或大于 1 的值,因为它用于将线性时间映射到输出时间。

        您列出的控制点值作为时间值没有意义。除非我弄错了,否则它们会导致时间倒退,并达到小于 0 的值。

        如果你想要一个任意大小的动画,你可以使用带有一系列控制点的 CAKeyFrameAnimation。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 2016-11-26
          • 1970-01-01
          相关资源
          最近更新 更多