移动CALayer的位置,而不是值和值?

时间:2014-01-22 20:54:57

标签: ios objective-c core-animation calayer cabasicanimation

这是使用位置永久移动CALayer的好方法吗?我真的需要一个来往于价值的动画吗?

serveBlock2 = [CALayer layer];
serveBlock2.zPosition = 1;
[serveBlock2 setFrame:CGRectMake(screenBounds.size.height/2, 0, screenBounds.size.height/2, screenBounds.size.width)];
[serveBlock2 setOpacity:0.0f];
[serveBlock2 setBackgroundColor:[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.8f].CGColor];
[self.view.layer addSublayer:serveBlock2];

CABasicAnimation *updateCurrentServe2 = [CABasicAnimation animationWithKeyPath:@"position.y"];
serveBlock2.position = CGPointMake((screenBounds.size.height/4)*3, -screenBounds.size.width/2);
[updateCurrentServe2 setTimingFunction:[CAMediaTimingFunction functionWithControlPoints:0.8 :-0.8 :1.0 :1.0]];
[updateCurrentServe2 setDuration:1.5];
[serveBlock2 addAnimation:updateCurrentServe2 forKey:@"serveBlock2 updateCurrentServe2"];

2 个答案:

答案 0 :(得分:2)

目前尚不清楚你在问什么。

核心动画实际上并没有移动它动画的图层的位置。它创建了图层正在变化的外观(通过更改图层的表示层),但实际上并未更改基础属性。通常,您要做的是启动动画运行,然后添加额外的语句来设置要更改为其结束值的属性/属性。然后当动画完成时,对象就在它的最终位置。

创建CAAnimation时,可以提供from和to值或仅提供值。如果您只提供一个to值,它将从它之前的位置动画到新位置。

如果您只想移动图层,请在没有动画的情况下设置它的位置属性。

如果图层是视图的背衬层,它将只是跳转到它的新位置。

如果图层是其他子图层,您将获得从旧值到新值的隐式动画。

答案 1 :(得分:1)

你有两个问题,我会以相反的顺序回答:

我真的需要一个来往于值的动画吗?

不,你不需要那个。

CABasicAnimation有三个属性,它们共同定义插值的完成方式,包括fromValuebyValuetoValue。它们可以通过the CABasicAnimation documentation中“设置插值”部分列出的多种不同方式进行组合。最后列出的组合是:

  
      
  • 所有属性均为nil。在目标图层的表示层中,keyPath的先前值与目标图层表示层中当前值keyPath之间进行插值。
  •   

所以你正在做的事情以及你所看到的结果是记录在案的行为并且有效。

这是使用位置永久移动CALayer的好方法吗?

这是一个非常自以为是的问题,我只能给你个人意见并尝试解释我的推理。

我个人不喜欢它,因为它不太明确,你需要在文档中阅读这个特殊情况才能知道它是如何工作的。正如您在问题评论中看到的那样,当我第一次看到它时,我甚至不确定这是如何工作的,我认为自己非常熟悉Core Animation并且多次阅读过这些文档。

这一切都归结为你和你的团队认为最具可读性和清晰度的内容。

我个人更喜欢明确设置新的模型值,然后只指定fromValue,即这种情况:

  
      
  • fromValue不是 - nil。在`fromValue和属性的当前显示值之间插值。
  •