我正在使用 GMSMapView 。因此,我添加了自定义 GMSMarker 并设置了图像(例如,自行车图像),并在用户开始移动并在locationManager中更改标记的角度时对该标记进行了动画处理。
目前,我只是在更新GMSMarker的position属性。 但却赋予了GMSMarker跳跃效果。 我想要而不是来移动/旋转,并将其GMSMarker 平滑/正确地旋转到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];
希望这可以帮助。