Ios 有没有办法用关键点进行3D变换?

Ios 有没有办法用关键点进行3D变换?,ios,objective-c,cocoa-touch,cocoa,core-animation,Ios,Objective C,Cocoa Touch,Cocoa,Core Animation,我创建了一个三维立方体视图转换,它执行以下操作: 创建图层容器 在二维空间中添加当前视图 将下一个视图添加到右侧并旋转90度(如在立方体中) 执行动画以旋转立方体 这是代码-工作正常。实际问题如下: - (CAAnimation*)makeRotationWithMetrics:(BBRotationMetrics*)metrics { [CATransaction flush]; CAAnimationGroup* group = [CAAnimationGroup ani

我创建了一个三维立方体视图转换,它执行以下操作:

  • 创建图层容器
  • 在二维空间中添加当前视图
  • 将下一个视图添加到右侧并旋转90度(如在立方体中)
  • 执行动画以旋转立方体
这是代码-工作正常。实际问题如下:

- (CAAnimation*)makeRotationWithMetrics:(BBRotationMetrics*)metrics
{
    [CATransaction flush];
    CAAnimationGroup* group = [CAAnimationGroup animation];
    group.delegate = self;
    group.duration = metrics.duration;
    group.fillMode = kCAFillModeForwards;
    group.removedOnCompletion = NO;
    group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

    CABasicAnimation* translationX = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.x"];
    translationX.toValue = metrics.translationPointsX;
    CABasicAnimation* rotation = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.rotation.y"];
    rotation.toValue = metrics.radians;

    CABasicAnimation* translationZ = [CABasicAnimation animationWithKeyPath:@"sublayerTransform.translation.z"];
    translationZ.toValue = metrics.translationPointsZ;
    group.animations = [NSArray arrayWithObjects:rotation, translationX, translationZ, nil];

    return group;
}
在动画结束时,我想执行一个抖动,就像立方体被安装在弹簧上一样。我尝试过播放一系列动画,围绕Y轴旋转,逐渐衰减

我已经设置了一系列动画,但是每个动画都从原点开始,而不是从层到达的最后一点开始。我怎样才能解决这个问题?一种方法是先在图层上设置变换


但是有没有办法用关键点进行3D变换呢

在我看来,您似乎在寻找
CAKeyframeAnimation
。不是指定
toValue
而是传递一个
值数组
和可选的
keyTimes
,包括开始值和结束值


从原点开始的问题来自于使用
removedOnCompletion
。通过这样做,您将在表示(屏幕上显示的内容)和模型(图层的特性值)之间引入差异。更简洁的方法是显式设置结束值,并从上一个值设置动画到结束值。动画完成后,这将使您处于干净状态

谢谢大卫。CAKeyFrameAnimation可用于三维变换?您指定了哪些值。关于从原点开始,您的意思是我应该避免设置该属性?(我将其设置为否)啊-我看到了如何将关键帧动画与3D变换和旋转结合使用-现在就尝试。好的-如果我将最后一个toValue保存为fromValue,我仍然可以按我的方式进行操作。但是关键帧无疑会更好。@Jasperblus关键帧是通过一系列值为同一属性设置动画的解决方案。设置一系列动画有时是必要的,但大部分都很混乱。@jasperblus避免使用
removedOnCompletion
只是为了清洁。核心动画中的动画不会修改它们正在设置动画的实际层,它们只会更改屏幕上显示的内容。如果设置特性动画并检查图层的值,则该特性不会更改。在实际动画期间,这并不重要,但如果不删除动画,则最终将处于模型中的值与屏幕中显示的值不同的状态。这可能会导致命中测试之类的事情变得一团糟。简而言之,引入不必要的状态差是不好的。