gpt4 book ai didi

objective-c - MKPolygon 的渲染标题

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:39 26 4
gpt4 key购买 nike

我正在尝试使用以下代码呈现 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

最佳答案

叠加层不会像注释那样自动显示它们的标题(实际上是在它们的标注中),因此您“不需要做”任何事情或可以启用任何配置。

如您所建议的,在叠加层上显示标题的一个简单解决方法是创建一个 UILabel .
然而,这UILabel应该添加到位于每个叠加层中心的注释 View

此方法的一个小缺点(或可能不是)是标题不会随着 map 的缩放而缩放——它们将保持相同大小并最终可能与其他标题发生碰撞和叠加(但您可能好的)。

要实现这种方法:

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

    注意自 MKPolygon实现两者 MKOverlay MKAnnotation协议(protocol),您不一定需要为每个覆盖创建单独的注释类或单独的对象。 MKPolygon自动设置其 coordinate属性设置为多边形的近似中心,因此您无需计算任何内容。 您可以只添加覆盖对象本身作为注释。下面的示例就是这样做的。

  2. 实现 mapView:viewForAnnotation:委托(delegate)方法并创建一个 MKAnnotationViewUILabel在其中显示 title .

例子:

[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有关如何实现它的一些想法。

关于objective-c - MKPolygon 的渲染标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22723449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com