如何使用CAKeyframeAnimation为CATransform3D设置动画?

yip*_*ipe 13 iphone core-animation objective-c ios

我已经使用CAKeyframeAnimations为图层transform.rotationtransform.translation.x属性设置动画,但是我无法transform隐式地为该属性设置动画.我有一个必须在两个状态之间设置动画的图层,而CABasicAnimation的默认插值完全不正确,并且不遵循我想要的路径.CAKeyframeAnimation救援,或者我认为.任何transform使用CAKeyframeAnimation 进行动画处理的尝试都会导致视图在其他动画运行时立即捕捉到最终转换.如果我删除下面函数的前半部分并让我的"转换"事件使用底部的CABasicAnimation,它会动画很好 - 尽管沿途有不正确的插值变换.

我的图层委托实现了以下内容:

- (id <CAAction>) actionForLayer:(CALayer *)layer forKey:(NSString *)event
{    
    if ([event isEqualToString:@"transform"])
    {
        CGSize startSize = ((CALayer *)self.layer.presentationLayer).bounds.size;
        CGSize endSize = self.layer.bounds.size;

        CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:event];
        animation.duration = 0.25;

        NSMutableArray *values = [NSMutableArray array];

        int stepCount = 10;
        for (int i = 0; i < stepCount; i++)
        {
            CGFloat p = i / (float)(stepCount - 1);
            CGSize size = [self interpolateBetweenSize:startSize andSize:endSize percentage:p];
            CATransform3D transform = [self transformForSize:size];
            [values addObject:[NSValue valueWithCATransform3D:transform]];
        }

        animation.values = values;
        return animation;
    }

    // All other animations use this basic animation
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    animation.removedOnCompletion = YES;
    animation.fillMode = kCAFillModeForwards;
    animation.duration = 0.25;
    return animation;
}
Run Code Online (Sandbox Code Playgroud)

我的变换是一个旋转后跟一个旋转,但我认为一个具有单独的关键帧动画的组动画通过平移和旋转动画将导致疯狂的城镇.我已经确认大小和变换对于我通过的p的所有值都是正确的,并且p的范围从0到1.

我试过设置一个非默认的计时功能,我试过设置一个计时函数数组,我省略了keyTImes,我设置了一个0的repeatCount,removedOnCompletion = YES,以及一个前进的fillMode和那个没有效果.我没有正确创建变换关键帧动画吗?

yip*_*ipe 0

这项技术在 iOS 3 中有效,但在 iOS 5.0 中似乎被破坏了。

5.1“神奇地”修复了这个问题,这似乎是 iOS 5.0 中的一个错误。我本来想归档雷达,但它现在在 5.1 中工作。

@Gsnyder:一些背景:我正在尝试类似 Clear 的 UI(对于与 Clear 完全无关的东西)并想出了这个:http ://blog.massivehealth.com/post/18563684407/clear 。这应该可以解释旋转和平移的需要。

此后,我创建了一个快门过渡,将视图细分为 N 层(而不是仅 2 层),从侧面查看时看起来像这样://///。

我的代码不是对边界进行动画处理,而是使用每一步的大小来确定必要的变换。

@Paul.s:隐式允许我将这种抽象保留在层类本身中,而不会污染拥有它的视图控制器。视图控制器应该只是改变周围的边界,并且图层应该适当移动。当视图本身可以处理它时,我不喜欢具有数十个自定义动画的视图控制器。

我需要使用关键帧动画,因为图层变换 / 和 _ 之间的默认动画通过不正确的角度进行动画处理,因此 ///\ 图层在整个变换过程中不会对齐。关键帧动画可确保边缘在全部动画时正确对齐。

我正在考虑关闭此功能,这似乎是 iOS 5.0 中的一个错误,现已修复。感谢大家。