UIViewAnimationCurve 仅具有

  • UIViewAnimationCurveEaseInOut
  • UIViewAnimationCurveEaseIn
  • UIViewAnimationCurveEaseOut
  • UIViewAnimationCurveLinear

  • 这些功能。

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

    像ExpoOut是[CAMediaTimingFunction functionWithControlPoints:0.12 :0.51 :-0.4 :1];
    我已经使用了 CABasicAnimation ,但是它不能像UIView动画一样更改框架,更改 View 大小时非常糟糕。

    或者,您有什么更好的方法可以像真实的那样改变视框,而不是像放大一样。

    谢谢。

    最佳答案

    这里的问题是无法为基于UIView的动画指定计时功能。据我所知,您接下来会遇到许多不愉快的选择:

  • 切换到使用基于CALayer的动画-严重的问题是,如果将委托(delegate)设置为 View ,则动画不会发生。因为这对于UIViews是必需的,所以这是一个没有吸引力的选项。
  • 将父图层添加到 View 中,并对该图层进行动画处理-同样严重的问题是,该图层将不在 Nib 中,并且对 Nib 的修改可能会无意间破坏动画。
  • 不要使用自定义计时功能。

  • 我通过在动画前将委托(delegate)设置为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];
    }
    

    到目前为止,它看起来像是一种魅力,但是由于临时为零的委托(delegate),我一直期待出现一些奇怪的工件。

    关于objective-c - 如何像CAMediaTimingFunction的functionWithControlPoints一样自定义UIViewAnimationCurve,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9905189/

    10-08 21:40