如何自定义UIViewAnimationCurve,如CAMediaTimingFunction的functionWithControlPoints

时间:2012-03-28 10:01:04

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

UIViewAnimationCurve 只有

  • UIViewAnimationCurveEaseInOut
  • UIViewAnimationCurveEaseIn
  • UIViewAnimationCurveEaseOut
  • UIViewAnimationCurveLinear

这些功能。

但是,我需要像UIView的 ExpoOut BackInOut 动画。

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

我使用了 CABasicAnimation ,但它不能像UIView动画那样改变 frame ,更改视图大小时非常糟糕。

或者,您是否有更好的方法来更改视图框架,就像真实一样,而不是像zoomin。

感谢。

3 个答案:

答案 0 :(得分:3)

这里的问题是无法为基于UIView的动画指定计时功能。据我所知,你会留下一些令人不快的选择:

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

我通过在动画制作之前将委托设置为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];
}

到目前为止,它看起来像一个魅力,但我一直期待一些奇怪的神器出现,因为暂时没有代表。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

您列出的控制点值与时间值无关。除非我弄错了,否则它们会导致时间倒退,并且值会小于0.

如果你想要一个类似大小的任意动画,你可以将CAKeyFrameAnimation与一系列控制点一起使用。