2016-05-31 2 views
1

У меня есть CALayer, что я явно оживляюсь на новую позицию. Свойство My toValue похоже только на исходное положение слоя.Доступен ли CABasicAnimation относительно исходного положения?

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), как будто он добавляет значения floatself.view.center в исходное положение слоя.

Предполагается ли, что собственность toValue будет действовать следующим образом? Какой самый чистый способ переместить мой blueDot в центр обзора?


EDIT:

-(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. 
+0

Существует свойство CAPropertyAnimation для управления этим именем 'additive'. Если вы не меняете его, он по умолчанию должен быть выключен. – jtbandes

+0

Да, я не устанавливаю свойство 'additive'. – chicobermuda

+2

Кроме того, похоже, что все это можно было бы сделать, используя неявные анимации, если вы просто хотите, чтобы позиция изменилась. – jtbandes

ответ

5

Вопрос заключается в том, что вы двигаетесь в frame слоя, но синяя точка path этого CAShapeLayer было смещение внутри, координаты этого слоя в frame по self.view.center.x - 60 - 5, 163.5 вы указали при создавая path для этого CAShapeLayer. Поэтому, когда вы оживляете слой position, синяя точка по-прежнему будет компенсирована этой суммой из этого нового position.

Исправление состоит в том, чтобы определить 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 его надтаблицы, это действительно будет сосредоточен (прямо сейчас, если вы перемещаете position слоя на self.view.center, это на самом деле не совсем по центру , так как это будет верхний левый угол слоя синей точки, который будет в центре);
  • вы можете использовать UIKit Dynamics, чтобы привязать его к месту или определить другие виды поведение,
  • вы можете использовать ограничение автоматической компоновки продиктовать размещения, если вы хотите,
  • можно определить UIView подкласс, который IBDesignable с этой точкой как представление, чтобы вы могли добавить его на раскадровку и посмотреть, как это выглядит; и т.п.
+0

В качестве альтернативы можно задать границы слоя формы как ограничивающего прямоугольника его пути. –

-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)); 
+0

'CGRectGetMidX (self.view.bounds)' такой же, как 'self.view.center.x'. К сожалению, это дает тот же результат. – chicobermuda

 Смежные вопросы

  • Нет связанных вопросов^_^