【问题标题】:How to custom UIViewAnimationCurve like CAMediaTimingFunction's functionWithControlPoints如何像 CAMediaTimingFunction 的 functionWithControlPoints 一样自定义 UIViewAnimationCurve
【发布时间】:2012-03-28 10:01:03
【问题描述】:
UIViewAnimationCurve只有
- UIViewAnimationCurveEaseInOut
- UIViewAnimationCurveEaseIn
- UIViewAnimationCurveEaseOut
- UIViewAnimationCurveLinear
这些功能。
但是,我需要 UIView 的 ExpoOut 、 BackInOut 动画。
像 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];
}
到目前为止,它似乎是一种魅力,但我一直期待着一些奇怪的神器出现,因为代理暂时为零。
【解决方案3】:
具有媒体计时功能的选项数量有限。您可以使用您列出的标准,或为三次贝塞尔曲线提供几个控制点。但是,您生成的曲线不能生成小于 0 或大于 1 的值,因为它用于将线性时间映射到输出时间。
您列出的控制点值作为时间值没有意义。除非我弄错了,否则它们会导致时间倒退,并达到小于 0 的值。
如果你想要一个任意大小的动画,你可以使用带有一系列控制点的 CAKeyFrameAnimation。