渲染MKPolygon的标题

时间:2014-03-28 21:23:43

标签: objective-c ios7 mkmapview mkpolygon

我正在尝试使用以下代码渲染MKPolygon

NSMutableArray *overlays = [NSMutableArray array];

        for (NSDictionary *state in states) {
            NSArray *points = [state valueForKeyPath:@"point"];

            NSInteger numberOfCoordinates = [points count];
            CLLocationCoordinate2D *polygonPoints = malloc(numberOfCoordinates * sizeof(CLLocationCoordinate2D));

            NSInteger index = 0;
            for (NSDictionary *pointDict in points) {
                polygonPoints[index] = CLLocationCoordinate2DMake([[pointDict valueForKeyPath:@"latitude"] floatValue], [[pointDict valueForKeyPath:@"longitude"] floatValue]);
                index++;
            }

            MKPolygon *overlayPolygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates];
            overlayPolygon.title = [state valueForKey:@"name"];

            [overlays addObject:overlayPolygon];

            free(polygonPoints);
        }
[self.stateMapView addOverlays:overlays];

我使用以下代码提供笔触和填充颜色:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(10_9, 7_0);
{
    if ([overlay isKindOfClass:[MKPolygon class]])
    {
        MKPolygonRenderer *pv = [[MKPolygonRenderer alloc] initWithPolygon:overlay];

        pv.fillColor = [UIColor redColor];
        pv.strokeColor = [UIColor blackColor];

        return pv;
    }

    return nil;
}

我是否需要做一些事情来渲染标题?我想我应该启用配置或其他东西,但我是MapView的新手。或者我需要创建一个UILabel

1 个答案:

答案 0 :(得分:3)

叠加层不会自动显示其注释标题(实际上在标注中),因此您无需做任何事情&#34;或您可以启用的任何配置。

根据建议,在叠加层上显示标题的简单解决方法是创建UILabel 但是,应将此UILabel添加到位于每个叠加层中心的注释视图

这种方法的一个小缺点(或者可能没有)是标题不会随着地图的缩放而缩放 - 它们会保持相同的大小,最终会与其他标题发生碰撞和叠加(但是你可能没关系。)

实施这种方法:

  1. 对于每个叠加层,添加注释(使用addAnnotation:addAnnotations:)并将coordinate设置为叠加层的大致中心,并将title设置为叠加层的标题。

    请注意,由于MKPolygon实现 MKOverlay MKAnnotation协议,因此您不一定需要为每个叠加层创建单独的注记类或单独的对象。 MKPolygon会自动将其coordinate属性设置为多边形的近似中心,因此您无需计算任何内容。 您只需将叠加层对象本身添加为注释。以下示例如何做到这一点。

  2. 实施mapView:viewForAnnotation:委托方法,并在其中创建MKAnnotationView,其中UILabel显示title
  3. 示例:

    [self.stateMapView addOverlays:overlays];
    
    //After adding the overlays as "overlays",
    //also add them as "annotations"...
    [self.stateMapView addAnnotations:overlays];
    
    
    //Implement the viewForAnnotation delegate method...
    -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[MKUserLocation class]])
        {
            //show default blue dot for user location...
            return nil;
        }
    
        static NSString *reuseId = @"ann";
        MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
        if (av == nil)
        {
            av = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];
            av.canShowCallout = NO;
    
            //add a UILabel in the view itself to show the title...
            UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
            titleLabel.tag = 42;
            titleLabel.backgroundColor = [UIColor clearColor];
            titleLabel.textColor = [UIColor blackColor];
            titleLabel.font = [UIFont boldSystemFontOfSize:16];
            titleLabel.textAlignment = NSTextAlignmentCenter;
            titleLabel.minimumScaleFactor = 0.5;
            [av addSubview:titleLabel];
            av.frame = titleLabel.frame;
        }
        else
        {
            av.annotation = annotation;
        }
    
        //find the UILabel and set the title HERE
        //so that it gets set whether we're re-using a view or not...
        UILabel *titleLabel = (UILabel *)[av viewWithTag:42];
        titleLabel.text = annotation.title;
    
        return av;
    }
    

    另一种方法是创建自定义叠加渲染器并自己完成所有绘图(多边形线,笔触颜色,填充颜色和文本)。有关如何实现该功能的一些想法,请参阅Draw text in circle overlayIs there a way to add text using Paths Drawing