使用CAMediaTimingFunction和基于块的UIView动画

epo*_*gee 3 cocoa cocoa-touch core-animation objective-c objective-c-blocks

视图编程指南适用于iOS告诉我们,基于块的动画是前进的道路,而不是现在几乎弃用begin/ commit风格的动画:

注意:如果您正在为iOS 4或更高版本编写应用程序,则应使用基于块的方法来设置动画内容.有关如何使用这些方法的信息,请参阅"使用基于块的方法启动动画".

但是现在我处于需要使用自定义计时功能的情况,CAMediaTimingFunction因此我使用了CATransactions和CABasicAnimations.这些类使用相同的语义语言与类似方法已过时的UIView动画风格[CATransaction begin][CATransaction commit].在应用程序中间只是感觉很奇怪,其他一切都是基于块的.

有没有办法将像CAMediaTimingFunctions 这样的概念与基于块的动画结合起来?

更新1:

我想要"阻止"的一段示例代码如下所示:*

[CATransaction begin];
{    
    [CATransaction setValue:[NSNumber numberWithFloat:3.0f] forKey:kCATransactionAnimationDuration];

    CGPoint low = CGPointMake(0.150, 0.000);
    CGPoint high = CGPointMake(0.500, 0.000);

    [CATransaction begin];
    {
        CAMediaTimingFunction* perfectIn = [CAMediaTimingFunction functionWithControlPoints:low.x :low.y :1.0 - high.x :1.0 - high.y];
        [CATransaction setAnimationTimingFunction: perfectIn];
        CABasicAnimation *fadeIn = [CABasicAnimation animationWithKeyPath:@"opacity"];
        fadeIn.fromValue = [NSNumber numberWithFloat:0];
        fadeIn.toValue = [NSNumber numberWithFloat:1.0];
        [viewB.layer addAnimation:fadeIn forKey:@"animateOpacity"];
    }
    [CATransaction commit];
}
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

更新2

我已经为我的另一个问题做了一个示例项目,其中包含上面的代码.它在github上.

ama*_*ttn 5

但是现在我处于需要使用自定义计时功能CAMediaTimingFunction的情况,因此我使用了CATransactions和CABasicAnimations.这些类使用与已弃用的UIView动画样式相同的语义语言,使用[CATransaction begin]和[CATransaction commit]等方法.在应用程序中间只是感觉很奇怪,其他一切都是基于块的.

我认为你误读了文档.

基于块的动画是进行UIView动画的方式.期.完全停止.

此声明与CoreAnimation不对应.您仍然必须使用开始/提交CoreAnimation.不要假设CA开始和提交都很糟糕,只是因为更高级别的构造(UIView)不赞成使用begin/commit.

有没有办法将像CAMediaTimingFunctions这样的概念与基于块的动画结合起来?

  • 如果您需要Core Anmiation的高级功能,例如自定义计时,您应该按照预期的方式使用CoreAnimation(使用begin/commit等)
  • 如果您尝试为CALayers设置动画,请使用Core Animation.
  • 如果您正在使用基于UIView的高级动画,请使用基于UIView块的动画.

  • 真正的问题是,无法为基于UIView的动画指定计时功能.据我所知,你会留下一些令人不快的选择: (3认同)