所有,我正在努力重现地图用来显示您自己位置的脉动蓝色圆圈效果......
我在 MKMapView 上分层了一个 UIView。UIView 包含脉动动画。
我最终使用了从 stackoverflow 上的众多答案中收集的以下代码:
CABasicAnimation* pulseAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
pulseAnimation.toValue = [NSNumber numberWithFloat: 0.0];
pulseAnimation.duration = 1.0;
pulseAnimation.repeatCount = HUGE_VALF;
pulseAnimation.autoreverses = YES;
pulseAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.layer addAnimation:pulseAnimation forKey:@"pulseAnimation"];
CABasicAnimation* resizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
resizeAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(0.0f, 0.0f)];
resizeAnimation.fillMode = kCAFillModeBoth;
resizeAnimation.duration = 1.0;
resizeAnimation.repeatCount = HUGE_VALF;
resizeAnimation.autoreverses = YES;
resizeAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.layer addAnimation:resizeAnimation forKey:@"resizeAnimation"];
这可以使我在 UIView 中绘制的圆脉冲/淡化一个可接受的工作:
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 0.4);
// And draw with a blue fill color
CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 0.1);
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 2.0);
CGContextAddEllipseInRect(context, CGRectMake(x-30, y-30, 60.0, 60.0));
CGContextDrawPath(context, kCGPathFillStroke);
但是我很快发现,虽然这似乎可行,但只要我将底层地图拖到另一个位置,动画就会崩溃......虽然我想要突出显示的位置在屏幕上居中,但一旦我拖动动画就可以了位置,所以它不再居中动画现在从屏幕的中心开始脉冲,放大到偏离中心的位置的中心,然后再次返回......一个幽默而酷的效果,但不是我想要的。
我意识到我可能在几个方面都很幸运。我不确定我误解了什么。我认为动画正在缩放整个图层,而我的圆圈恰好画在它的中间。所以它在居中时有效,但在偏离中心时无效。
当我开始这个问题时,我尝试了从 stackoverflow 提出的一个问题中收集到的以下内容:
CABasicAnimation* translateAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
translateAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(oldx, oldy )];
translateAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(x, y )];
// translateAnimation.fillMode = kCAFillModeBoth; translateAnimation.duration = 1.0; translateAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [self.layer addAnimation:translateAnimation forKey:@"translateAnimation"];
但这并没有太大帮助,当我玩它时,有时它看起来好像在我将它移离中心后它在正确的位置进行动画处理,但随后它会从中心点切换回动画到新位置。
Sooo,任何建议或我是否需要提供其他信息。