我有一个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.
答案 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
,它并不是真正的中心,因为它将位于蓝点的左上角,将位于中心); 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));