objective-c – 向MKMapView添加多个叠加层

objective-c – 向MKMapView添加多个叠加层,第1张

概述我在理解如何向MKMapView添加多个叠加层时遇到一些麻烦. 我有跟踪的阵列路线.跟踪的路由是CLLocations数组.所以我有一个数组数组. 我可以采取一条路线并在地图视图上绘制它.但是,我需要将所有路径绘制到地图视图中. 以下是我如何为1条路线创建MKPolyline: -(void) loadRoute{ //So we grab an array that holds all 我在理解如何向MKMapVIEw添加多个叠加层时遇到一些麻烦.

我有跟踪的阵列路线.跟踪的路由是CLLocations数组.所以我有一个数组数组.

我可以采取一条路线并在地图视图上绘制它.但是,我需要将所有路径绘制到地图视图中.

以下是我如何为1条路线创建MKpolyline:

-(voID) loadRoute{    //So we grab an array that holds all the locations of one route.             NSArray *locations = [[NSArray alloc] initWithArray:[routesArray objectAtIndex:0]];            // while we create the route points,we will also be calculating the bounding Box of our route            // so we can easily zoom in on it.             MKMapPoint northEastPoint;             MKMapPoint southWestPoint;             // create a c array of points.             MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) *[locations count]);            for(int IDx = 0; IDx < [locations count]; IDx++)            {                CLLocation *tempLoc = (CLLocation*)[locations objectAtIndex:IDx];                CLLocationdegrees latitude  = tempLoc.coordinate.latitude;                CLLocationdegrees longitude = tempLoc.coordinate.longitude;                // create our coordinate and add it to the correct spot in the array                 CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude,longitude);                MKMapPoint point = MKMapPointForCoordinate(coordinate);                // if it is the first point,just use them,since we have nothing to compare to yet.                 if (IDx == 0) {                    northEastPoint = point;                    southWestPoint = point;                }                else                 {                    if (point.x > northEastPoint.x)                         northEastPoint.x = point.x;                    if(point.y > northEastPoint.y)                        northEastPoint.y = point.y;                    if (point.x < southWestPoint.x)                         southWestPoint.x = point.x;                    if (point.y < southWestPoint.y)                         southWestPoint.y = point.y;                }                pointArr[IDx] = point;            }            self.routeline = [MKpolyline polylineWithPoints:pointArr count:[locations count]];//Zoom in to fit route on screen            _routeRect = MKMapRectMake(southWestPoint.x,southWestPoint.y,northEastPoint.x - southWestPoint.x,northEastPoint.y - southWestPoint.y);            // clear the memory allocated earlIEr for the points            free(pointArr);}

这是返回叠加层的MapKit委托调用:

#pragma mark MKMapVIEwDelegate- (MKOverlayVIEw *)mapVIEw:(MKMapVIEw *)mapVIEw vIEwForOverlay:(ID <MKOverlay>)overlay{    MKOverlayVIEw* overlayVIEw = nil;    if(overlay == self.routeline)    {        //if we have not yet created an overlay vIEw for this overlay,create it Now.         if(nil == self.routelineVIEw)        {            self.routelineVIEw = [[MKpolylineVIEw alloc] initWithpolyline:self.routeline];            self.routelineVIEw.fillcolor = [UIcolor redcolor];            self.routelineVIEw.strokecolor = [UIcolor redcolor];            self.routelineVIEw.linewidth = 3;        }        overlayVIEw = self.routelineVIEw;    }    return overlayVIEw;}

所以上面给出的所有代码都可以.我无法弄清楚如何加载更多叠加来显示其他路线.

我认为可能在loadRoute方法中,运行所有路由并为每个路由创建MKOverlayVIEw.将所有MKOverlayVIEw存储在一个数组中然后执行:
[self.mapVIEw addOverlays:array];

但它不起作用.问题是在委托方法中我不知何故需要知道返回哪个叠加层.

所以,如果我可以做的事情:

- (MKOverlayVIEw *)mapVIEw:(MKMapVIEw *)mapVIEw vIEwForOverlay:(ID <MKOverlay>)overlay{    int tag = overlay.tag;    return (MKOverlayVIEw*)[arrayOfVIEws objectAtIndex:tag];}

它会工作正常.但不幸的是它不像那样:(

任何帮助将非常感谢!

编辑:

我在VIEwDIDLoad中使用它来添加叠加层:

[self loadRoute];        // add the overlay to the map        if (nil != self.routeline) {            [self.mapVIEw addOverlay:self.routeline];        }        // zoom in on the route.         [self zoomInOnRoute];

这是在标题中:

// the data representing the route points.     MKpolyline* _routeline;    // the vIEw we create for the line on the map    MKpolylineVIEw* _routelineVIEw;    // the rect that bounds the loaded points    MKMapRect _routeRect;
解决方法 routeline和routelineVIEw变量一次只能指向一个叠加层和叠加层视图,因此理论上你需要一个这样的变量数组.

但是,根据显示的代码,您不需要首先保留对这些的引用.

我建议删除routeline和routelineVIEw变量.

然后,您只需在本地创建一个覆盖对象,并在vIEwForOverlay中返回所请求的覆盖参数的视图.

在loadRoute方法中,您可以循环遍历routesArray,并为每个路由创建一个本地覆盖对象,并在其上调用addOverlay.

还有一种更简单的方法来构造一个界定所有路径的地图矩形,以便您可以设置地图的区域以显示所有路线.

例:

-(voID) loadRoute{    _routeRect = MKMapRectNull;    for (int raIndex = 0; raIndex < routesArray.count; raIndex++)     {        //So we grab an array that holds all the locations of one route.         NSArray *locations = [[NSArray alloc] initWithArray:                                 [routesArray objectAtIndex:raIndex]];        //note we are getting object at raIndex (not 0) above        //...no change to existing code here...        //self.routeline = [MKpolyline polylineWithPoints:pointArr count:[locations count]];        //replace above line with this...        MKpolyline *pl = [MKpolyline polylineWithPoints:pointArr count:[locations count]];        [mapVIEw addOverlay:pl];        //Zoom in to fit route on screen        //_routeRect = MKMapRectMake(southWestPoint.x,northEastPoint.y - southWestPoint.y);        //replace above line with this to create a rect around ALL routes...        if (MKMapRectIsNull(_routeRect))            _routeRect = pl.boundingMapRect;        else            _routeRect = MKMapRectUnion(_routeRect,pl.boundingMapRect);        // clear the memory allocated earlIEr for the points        free(pointArr);    }    }

在vIEwDIDLoad中,只需调用loadRoute,不要调用addOverlay.

vIEwForOverlay方法变得更加简单:

- (MKOverlayVIEw *)mapVIEw:(MKMapVIEw *)mapVIEw vIEwForOverlay:(ID <MKOverlay>)overlay{    MKpolylineVIEw *pv = [[MKpolylineVIEw alloc] initWithpolyline:overlay];    pv.fillcolor = [UIcolor redcolor];    pv.strokecolor = [UIcolor redcolor];    pv.linewidth = 3;    return pv;}

顺便说一句,在loadRoute中,这一行:

MKMapPoint* pointArr = malloc(sizeof(CLLocationCoordinate2D) *[locations count]);

应该:

MKMapPoint* pointArr = malloc(sizeof(MKMapPoint) *[locations count]);

它应该使用MKMapPoint的大小(而不是CLLocationCoordinate2D).它们不是一回事(即使结构碰巧是相同的字节大小).

总结

以上是内存溢出为你收集整理的objective-c – 向MKMapView添加多个叠加层全部内容,希望文章能够帮你解决objective-c – 向MKMapView添加多个叠加层所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1010953.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存