相对于初始位置,CABasicAnimation的值是否为?

时间:2016-05-31 19:25:33

标签: ios objective-c core-animation cabasicanimation

我有一个CALayer,我明确地想要一个新职位。我的toValue属性似乎只与图层的初始位置有关。

    CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"position"];
    move.fromValue = [NSValue valueWithCGPoint:CGPointMake(blueDot.position.x, blueDot.position.y)];
    move.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.center.x, self.view.center.y)];
    move.duration = 1.0;
    [blueDot addAnimation:move forKey:@"myMoveAnimation"];
    blueDot.position = CGPointMake(self.view.center.x, self.view.center.y);

因此,此代码不会将图层重新绘制到视图的中心。似乎它正在将图层重新绘制为CGPointMake(self.view.center.x + blueDot.position.x, self.view.center.y + blueDot.position.y),就像它将float self.view.center值添加到图层的起始位置一样。

toValue属性是否应该像这样?将blueDot移动到视图中心的最简洁方法是什么?

编辑:

    -(void)viewDidLoad {
        [super viewDidLoad];

        blueDot = [CAShapeLayer layer];
        [blueDot setPath:[[UIBezierPath bezierPathWithOvalInRect:CGRectMake(self.view.center.x - 60 - 5, 163.5, 10, 10)] CGPath]];
        [blueDot setStrokeColor: [UIColor blueColor]CGColor];
        [blueDot setFillColor:[UIColor blueColor]CGColor];
        [[self.view layer] addSublayer:blueDot];
    }

// 163.5 is a placeholder for another view's position value so it's more readable for you guys.

2 个答案:

答案 0 :(得分:5)

问题是您正在移动图层的frame,但此path的蓝点CAShapeLayer已在该图层frame中偏移{ {1}},为self.view.center.x - 60 - 5, 163.5创建path时指定的坐标。因此,当您为图层的CAShapeLayer设置动画时,蓝点仍会偏离此新position的数量。

修复方法是将position的{​​{1}}定义为图层的左上角,例如

path

现在,当您移动CAShapeLayer时,蓝点的原点就会移动。

顺便说一句,我通常会创建一个单独的CAShapeLayer *blueDot = [CAShapeLayer layer]; blueDot.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(5, 5) radius:5 startAngle:0 endAngle:M_PI * 2 clockwise:true].CGPath; // note that using arc often generates a better looking circle, probably not noticeable at this size, just probably good practice blueDot.fillColor = [UIColor blueColor].CGColor; 并将此position添加到其中。这样,您就可以享受各种不同的功能:

  • 您可以享受UIView基于块的动画;
  • 您可以使用CAShapeLayer来移动它,以便当您将其UIView移动到其超级视图的center时,它将真正居中(现在,如果您移动它center层的center,它并不是真正的中心,因为它将位于蓝点的左上角,将位于中心);
  • 您可以使用UIKit Dynamics将其捕捉到位置或定义其他行为,
  • 如果需要,您可以使用自动布局约束来指定展示位置
  • 您可以使用此点作为视图定义position self.view.center个子类,以便您可以将其添加到故事板上并查看它的外观;等

答案 1 :(得分:-1)

您在toValue的超级视图的坐标系中设置了view(因为使用了center属性)。看起来这应该有效:

CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"position"];
move.fromValue = [NSValue valueWithCGPoint:CGPointMake(blueDot.position.x, blueDot.position.y)];
move.toValue = [NSValue valueWithCGPoint:CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds))];
move.duration = 1.0;
[blueDot addAnimation:move forKey:@"myMoveAnimation"];
blueDot.position = CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds));