如何自定义UIViewAnimationCurve,如CAMediaTimingFunction的functionWithControlPoints

yel*_*low 5 animation core-animation objective-c uiviewanimation ios

UIViewAnimationCurve只有

  • UIViewAnimationCurveEaseInOut
  • UIViewAnimationCurveEaseIn
  • UIViewAnimationCurveEaseOut
  • UIViewAnimationCurveLinear

这些功能.

但是,我需要像UView的ExpoOut,BackInOut动画.

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

我使用过CABasicAnimation,但它不能像UIView动画一样改变,改变视图大小时非常糟糕.

或者,你有没有更好的方法来改变像真实的视图框架,而不是像zoomin.

谢谢.

nom*_*tis 3

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

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

我通过在动画之前将委托设置为 nil 并在之后设置回 UIView 来破解我的方法,但感觉很脏。不过,我可能错过了一些东西。我的代码看起来像这样:

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

到目前为止,它似乎很有魅力,但由于暂时为零的代表,我一直期待一些奇怪的工件出现。

\n