使用 UIView 作为 MKMapView 子视图来绘制路线
Posted
技术标签:
【中文标题】使用 UIView 作为 MKMapView 子视图来绘制路线【英文标题】:using a UIView as MKMapView subview to draw a route 【发布时间】:2010-01-14 17:50:21 【问题描述】:首先我很抱歉我的英语不好。
我正在尝试在 UIView 中绘制路线并将该视图设置为 MKMapView。
现在我有一个 UIView 类 (ViewClass),我在其中放置了所有的触摸方法,并将我的 viewcontroller 的视图设置为该类的一个实例。 MKMapView 是一个 viewcontroller.view 子视图。 我可以在 MKMapView 中进行所有操作。 为了绘制轨迹,我将 UIView (trailView) 设置为背景颜色清晰的 MKMapView 子视图。 我尝试在 MKMapView 移动时移动 trailView,但效果不佳。移动并不完美。
这个想法是将视图附加到 MKMapView。我不知道这是否可能,或者我是否真的必须使用 MKAnnotationView。 我以前用 MKAnnotationView 试过,但这会消耗很多内存。
我非常感谢一些帮助。 提前致谢。
【问题讨论】:
【参考方案1】:ios4 有一个新的覆盖系统,包括路径的渲染。我还没有使用它,但它似乎比尝试滚动自己的叠加层要简单得多。
见http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKOverlayPathView_class/Reference/Reference.html#//apple_ref/doc/uid/TP40009713
【讨论】:
【参考方案2】:这是一个很好的问题。
您如何从您感兴趣的地图区域获取像素数据,并根据路径的颜色,进行最近邻计算。在你正在寻找的方向。边走边保存这条路径,然后在 trailView 中渲染不同的颜色?
使这更复杂的是缩放,因为您必须有一个独立于分辨率的轨迹(转换地图坐标)而不是像素坐标。因此,您将像素坐标转换为地图坐标,然后它应该缩放以进行缩放。
【讨论】:
我不明白您所说的“基于路径的颜色,进行最近邻计算”是什么意思。这种方式不是更复杂吗?如果使用 MKAnnotationView 不是一个好主意,我还有钱。 MKAnnotationView 是否消耗大量内存?我有一个我的应用程序版本,我在其中使用它,但是在我创建一些注释后它会因内存不足而崩溃。谢谢你的回复:) 也许我理解错了。当您说运动不完美时,我认为您的意思是路径没有排列。你的意思是即使它是准确的,性能也是不可接受的?来自 Apple 文档:“注释对象不提供注释的视觉表示,但通常协调(与地图视图的委托一起)创建适当的 MKAnnotationView 对象来处理显示。”因此,如果您在小空间中使用大量坐标(数千个),MKAnnotationView 似乎不正确。你能给我们看看代码和崩溃日志吗?【参考方案3】:线索是排队的,但是当我滚动时,我得到了一个糟糕的结果。 关于我的应用程序的 MKAnnotatioView 版本,我可以向您展示代码,但我无法向您展示日志,因为不幸的是我现在不在 iphone...
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
self.startingPoint = newLocation;
CLLocation *lastLocation;
if([pointArray count] >= 2)
lastLocation = [pointArray objectAtIndex:1];
[pointArray removeAllObjects];
mapView.showsUserLocation = NO;
double lat,lon;
lat = newLocation.coordinate.latitude;
lon = newLocation.coordinate.longitude;
if(distanceIndex == 0)
[pointArray insertObject:newLocation atIndex:0];
else
if(distanceIndex == 1)
[pointArray insertObject:newLocation atIndex:1];
else
[pointArray insertObject:lastLocation atIndex:0];
[pointArray insertObject:newLocation atIndex:1];
if(distanceIndex == 0)
MarkPlace *mark = nil;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]];
[dateFormatter release];
NSString *subtitle = [NSString stringWithFormat:@"Time Here: %@", dateStr];
mark = [[[MarkPlace alloc] initWithCoordinate:[[pointArray objectAtIndex:0] coordinate] currentTime:subtitle annotationType:MarkPlaceTypeEnd title:@"Pin Title"] autorelease];
[mapView addAnnotation:mark];
//create the route
MKCoordinateSpan span = mapView.region.span;
CLLocationCoordinate2D center = mapView.region.center;
IFRouteAnnotations *routeAnnotation = [[[IFRouteAnnotations alloc] initWithPoints:pointArray:0:span:center] autorelease];
[mapView addAnnotation:routeAnnotation];
[mapView setRegion:routeAnnotation.region animated:TRUE];
distanceIndex = distanceIndex + 1;
[routeAnnotation release];
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
//re-enable and re-position the route display
for (NSObject *key in [routeViews allKeys])
IFRouteView *routeView = [routeViews objectForKey:key];
[routeView regionChanged];
-(MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id <MKAnnotation>)annotation
MKAnnotationView *annotationView = nil;
NSLog(@"viewForAnnotation");
if(distanceIndex == 0)
MKPinAnnotationView *pin=[[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease];
pin.pinColor = MKPinAnnotationColorGreen;
pin.animatesDrop = TRUE;
pin.userInteractionEnabled = YES;
annotationView = pin;
[annotationView setEnabled:YES];
[annotationView setCanShowCallout:YES];
if([annotation isKindOfClass:[IFRouteAnnotations class]])
IFRouteAnnotations *routeAnnotation = (IFRouteAnnotations *)annotation;
annotationView = [routeViews objectForKey:routeAnnotation.routeID];
if(annotationView == nil)
IFRouteView *routeView = [[[IFRouteView alloc] initWithFrame:CGRectMake(0,0, mapView.frame.size.width, mapView.frame.size.height)]autorelease];
routeView.annotation = routeAnnotation;
routeView.mapView = mapView;
[routeViews setObject:routeView forKey:routeAnnotation.routeID];
annotationView = routeView;
return annotationView;
我不知道你会不会明白。我的代码基于link text。 谢谢你的帮助!! :)
【讨论】:
以上是关于使用 UIView 作为 MKMapView 子视图来绘制路线的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MKMapView(或任何 UIView)裁剪为自定义形状?
如何在自定义 UIView 下方的 MKMapview 中启用 touchEvents(滚动和平移)?