[ios]动画视觉元素沿ARC在 MapKit

发布时间: 2017/3/21 23:26:50
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

如何添加和动画沿ARC,里面 mapkit造成的视觉元素?

下面的代码将创建两个点之间好ARC。想象一下动画的视觉表示沿着这种ARC飞行的飞机。

-(void)addArc
{
    CLLocationCoordinate2D sanFrancisco = { 37.774929, -122.419416 };
    CLLocationCoordinate2D newYork = { 40.714353, -74.005973 };
    CLLocationCoordinate2D pointsArc[] = { sanFrancisco, newYork };
    //
    MKGeodesicPolyline *geodesic;
    geodesic = [MKGeodesicPolyline polylineWithCoordinates:&pointsArc[0]
                                                     count:2];
    //
    [self.mapView addOverlay:geodesic];
}

enter image description here

解决方法 1:

注释可能实际上是最好的选择。 定义注释类,可赋值的坐标属性 (或使用 MKPointAnnotation )。

神奇的是, MKGeodesicPolyline 类是一种足以供应它计算来创建通过ARC的各个点 points 属性 (给出了 MKMapPoint s) 或 getCoordinates:range: 方法 (给出了 CLLocationCoordinate2D s)。

(实际上,属性和方法是在 MKMultiPoint 类的 MKPolyline 是类的子类和 MKGeodesicPolyline 是一个子类的 MKPolyline 。)

只更新所批注的 coordinate 上的计时器和地图视图的属性将自动移动该批注。

注︰ ARC这么长的时间,将有数千个点。

这里是一个非常简单的原油的例子使用 points 属性 (比易于使用 getCoordinates:range: 方法) 和 performSelector:withObject:afterDelay: :

//declare these ivars:
MKGeodesicPolyline *geodesic;
MKPointAnnotation *thePlane;
int planePositionIndex;

//after you add the geodesic overlay, initialize the plane:
thePlane = [[MKPointAnnotation alloc] init];
thePlane.coordinate = sanFrancisco;
thePlane.title = @"Plane";
[mapView addAnnotation:thePlane];

planePositionIndex = 0;
[self performSelector:@selector(updatePlanePosition) withObject:nil afterDelay:0.5];

-(void)updatePlanePosition
{
    //this example updates the position in increments of 50...
    planePositionIndex = planePositionIndex + 50;

    if (planePositionIndex >= geodesic.pointCount)
    {
        //plane has reached end, stop moving
        return;
    }

    MKMapPoint nextMapPoint = geodesic.points[planePositionIndex];

    //convert MKMapPoint to CLLocationCoordinate2D...
    CLLocationCoordinate2D nextCoord = MKCoordinateForMapPoint(nextMapPoint);

    //update the plane's coordinate...
    thePlane.coordinate = nextCoord;

    //schedule the next update...    
    [self performSelector:@selector(updatePlanePosition) withObject:nil afterDelay:0.5];
}
赞助商