沿着最后更新的 GPS 坐标平滑地移动和旋转 GMSMarker Swift iOS

Move and Rotate GMSMarker smoothly along last updated GPS coordinates Swift iOS

我正在使用 GMSMapView。所以我添加了自定义 GMSMarker 并设置图像(例如自行车图像)并在用户开始移动时为该标记设置动画并在 locationManager 中更改标记的角度。

目前我正在更新 GMSMarker 的位置属性。 但是它给了GMSMarker跳跃效果。 我想移动和旋转 GMSMarker smoothly/properly 到 GMSMapView 中,而不是这个

我怎样才能在 Swift 中做到这一点?谢谢

   (void)updateLocationoordinates(CLLocationCoordinate2D) coordinates
    { 
     if (marker == nil) {
      marker = [GMSMarker markerWithPosition:coordinates];
      marker.icon = [UIImage imageNamed:IMAGE];
      marker.map = mapView;
    } else{
     marker.position = coordinates; 
          }
    }  

我遇到过同样的问题,尝试了很多方法。最后我想出了一个解决方案 - 在以前的位置点和现在的位置点之间获取角度,我使用了 UIImageView 而不是 GMSMarker。

//in location update method
CGPoint anglepoint = [myMapView.projection pointForCoordinate:currLocation.coordinate];
CGFloat angle = [self getAngle:anglepoint];
if(!isnan(angle)){
     [UIView beginAnimations:nil context:nil];
     [UIView setAnimationDuration:0.8f];
     sampleImgView.transform = CGAffineTransformMakeRotation(angle);
     [sampleImgView setCenter:[myMapView.projection pointForCoordinate:CLLocationCoordinate2DMake(currLocation.coordinate.latitude, currLocation.coordinate.longitude)]];
     [UIView commitAnimations];
     prevCurrLocation = currLocation;
}


-(CGFloat) getAngle: (CGPoint) touchedPoints
{
    CGPoint previousLocationPoint = [myMapView.projection pointForCoordinate:prevCurrLocation.coordinate];

    CGFloat x1 = previousLocationPoint.x;
    CGFloat y1 = previousLocationPoint.y;

    CGFloat x2 = touchedPoints.x;
    CGFloat y2 = touchedPoints.y;

    CGFloat x3 = x1;
    CGFloat y3 = y2;

    CGFloat oppSide = sqrtf(((x2-x3)*(x2-x3)) + ((y2-y3)*(y2-y3)));
    CGFloat adjSide = sqrtf(((x1-x3)*(x1-x3)) + ((y1-y3)*(y1-y3)));

    CGFloat angle = atanf(oppSide/adjSide);
    // Quadrant Identifiaction
    if(x2 < previousLocationPoint.x)
    {
        angle = 0-angle;
    }


    if(y2 > previousLocationPoint.y)
    {
        angle = M_PI/2 + (M_PI/2 -angle);
    }
    return angle;
}

将其用于动画:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5f];
sampleImgView.transform = CGAffineTransformMakeRotation(angle);
[sampleImgView setCenter:[myMapView.projection pointForCoordinate:CLLocationCoordinate2DMake(currLocation.coordinate.latitude, currLocation.coordinate.longitude)]];
[UIView commitAnimations];

这是示例 Imageview:

sampleImgView = [[UIImageView alloc]init];
sampleImgView.center = myMapView.center;
sampleImgView.frame = CGRectMake(0,0, 25, 50);
sampleImgView.backgroundColor = [UIColor clearColor];
[myMapView addSubview:sampleImgView];

希望对您有所帮助。