围绕Google地图标记iOS的脉冲环animation

我想添加一个脉冲环animation作为iOS谷歌地图中的当前用户位置(如Uber)。 我尝试通过addAnimationCABasicAnimation添加到标记图层。 它不工作。

此外,我试图animation标记的规模,但规模的变化并没有发生。 有人可以帮我这个东西吗?

不知何故,现在正在工作。 我创build了一个自定义视图,并将该视图设置为GMSMarker iconView 。 之后,添加到视图层的animation。

 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 100, 100)]; view.backgroundColor = [UIColor redColor]; view.layer.cornerRadius = 50; GMSMarker *m = [GMSMarker markerWithPosition:mapView_.myLocation.coordinate]; m.iconView = view; m.map = mapView_; CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; scaleAnimation.duration = 1.5; scaleAnimation.repeatCount = HUGE_VAL; scaleAnimation.autoreverses = YES; scaleAnimation.fromValue = [NSNumber numberWithFloat:0.1]; scaleAnimation.toValue = [NSNumber numberWithFloat:1.2]; [view.layer addAnimation:scaleAnimation forKey:@"scale"]; 

另一种方法:


 GMSMarker *m = [GMSMarker markerWithPosition:mapView_.myLocation.coordinate]; //custom marker image UIImageView *pulseRingImg = [[UIImageView alloc] initWithFrame: CGRectMake(-30, -30, 78, 78)]; pulseRingImg.image = [UIImage imageNamed:@"Pulse"]; pulseRingImg.userInteractionEnabled = NO; //transform scale animation CABasicAnimation *theAnimation; theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"]; theAnimation.duration = 3.5; theAnimation.repeatCount = HUGE_VALF; theAnimation.autoreverses = NO; theAnimation.fromValue = [NSNumber numberWithFloat:0.0]; theAnimation.toValue = [NSNumber numberWithFloat:2.0]; //alpha Animation for the image CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; animation.duration = 3.5; animation.repeatCount = HUGE_VALF; animation.values = [NSArray arrayWithObjects: [NSNumber numberWithFloat:1.0], [NSNumber numberWithFloat:0.5], [NSNumber numberWithFloat:0.0], nil]; animation.keyTimes = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:1.2], [NSNumber numberWithFloat:3.5], nil]; [pulseRingImg.layer addAnimation:animation forKey:@"opacity"]; [pulseRingImg.layer addAnimation:theAnimation forKey:@"pulse"]; pulseRingImg.userInteractionEnabled = NO; m.iconView = pulseRingImg; [m.layer addSublayer:pulseRingImg.layer]; m.map = mapView_; m.groundAnchor = CGPointMake(0.5, 0.5); 

另一个:

 m = [GMSMarker markerWithPosition:mapView_.myLocation.coordinate]; //custom marker image UIImageView *pulseRingImg = [[UIImageView alloc] initWithFrame: CGRectMake(-30, -30, 78, 78)]; pulseRingImg.image = [UIImage imageNamed:@"Pulse"]; pulseRingImg.userInteractionEnabled = NO; [CATransaction begin]; [CATransaction setAnimationDuration:3.5]; //transform scale animation CABasicAnimation *theAnimation; theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"]; theAnimation.repeatCount = HUGE_VALF; theAnimation.autoreverses = NO; theAnimation.fromValue = [NSNumber numberWithFloat:0.0]; theAnimation.toValue = [NSNumber numberWithFloat:2.0]; [pulseRingImg.layer addAnimation:theAnimation forKey:@"pulse"]; pulseRingImg.userInteractionEnabled = NO; [CATransaction setCompletionBlock:^{ //alpha Animation for the image CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; animation.duration = 3.8; animation.repeatCount = HUGE_VALF; animation.values = [NSArray arrayWithObjects: [NSNumber numberWithFloat:1.0], [NSNumber numberWithFloat:0.0], nil]; [m.iconView.layer addAnimation:animation forKey:@"opacity"]; }]; [CATransaction commit]; m.iconView = pulseRingImg; [m.layer addSublayer:pulseRingImg.layer]; m.map = mapView_; m.groundAnchor = CGPointMake(0.5, 0.5); 

Swift 3.0代码如下:注意:根据您的要求更改持续时间

  let m = GMSMarker(position: camera.target) //custom marker image let pulseRingImg = UIImageView(frame: CGRect(x: -30, y: -30, width: 78, height: 78)) pulseRingImg.image = UIImage(named: "Pulse") pulseRingImg.isUserInteractionEnabled = false CATransaction.begin() CATransaction.setAnimationDuration(3.5) //transform scale animation var theAnimation: CABasicAnimation? theAnimation = CABasicAnimation(keyPath: "transform.scale.xy") theAnimation?.repeatCount = Float.infinity theAnimation?.autoreverses = false theAnimation?.fromValue = Float(0.0) theAnimation?.toValue = Float(2.0) theAnimation?.isRemovedOnCompletion = false pulseRingImg.layer.add(theAnimation!, forKey: "pulse") pulseRingImg.isUserInteractionEnabled = false CATransaction.setCompletionBlock({() -> Void in //alpha Animation for the image let animation = CAKeyframeAnimation(keyPath: "opacity") animation.duration = 3.5 animation.repeatCount = Float.infinity animation.values = [Float(2.0), Float(0.0)] m.iconView?.layer.add(animation, forKey: "opacity") }) CATransaction.commit() m.iconView = pulseRingImg m.layer.addSublayer(pulseRingImg.layer) m.map = gmapView m.groundAnchor = CGPoint(x: 0.5, y: 0.5) 

脉冲图像: 脉冲图像的动画