我有一个地图视图,上面有注释。对于每个注释,我需要显示一个只是一个圆圈的叠加层。根据值,该圆需要是两种不同颜色中的一种。用户可以在屏幕上选择其他内容,并且需要删除所有注释和叠加层,并且需要根据新选择的项目添加新的注释和叠加层。
第一次加载具有地图视图的控制器时,一切都很好。当用户选择新项目时,将删除旧注释和叠加层,并添加新注释和叠加层,但不会显示叠加层。当我输入断点时,我没有看到mapview:rendererForOverlay方法在用户选择新项目后被调用。以下是我正在使用的代码:
在viewDidLoad中,我有以下内容:
_mapview.delegate = self;
[self placePinsOnMap];
placePinsOnMap:方法具有以下内容:
- (void)placePinsOnMap {
AMapAnnotation* annotation;
for (APlace* place in _selectedItem.places) {
annotation = [[AMapAnnotation alloc] initWithTitle:place.name subtitle:place.subtitle coordinate:place.location];
annotation.object = place;
[_mapview addAnnotation:annotation];
[_mapview addOverlay:[[AMapOverlay alloc] initWithCenterCoordinate:place.location radius:[_place.size floatValue]*1000 object:place] level:MKOverlayLevelAboveRoads];
}
}
每次添加叠加层时,都会调用mapview:rendererForOverlay。这看起来像这样:
- (MKOverlayRenderer*)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
MKCircleRenderer* circleRenderer;
AMapOverlay* mapOverlay;
APlace* place;
mapOverlay = (AMapOverlay*)overlay;
place = mapOverlay.object;
circleRenderer = [[MKCircleRenderer alloc] initWithCircle:mapOverlay];
if ([place.radius floatValue] >= 5 && [place.radius floatValue] <= 10) {
circleRenderer.fillColor = [[UIColor greenColor] colorWithAlphaComponent:0.2];
} else {
circleRenderer.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.2];
}
return circleRenderer;
}
当用户选择新项目时,我会删除所有注释和叠加层,并为所选的新项目添加新注释及其叠加层:
- (void)onScrollviewTap:(UITapGestureRecognizer*)recognizer {
CGPoint point;
point = [recognizer locationInView:_scrollview];
for (ACard* card in _cards) {
if (CGRectContainsPoint(card.frame, point)) {
card.selected = YES;
_selectedItem = card.item;
NSArray* array = [_mapview annotations];
for (id<MKAnnotation> annotation in array) {
if (annotation != _userAnnotation) {
[_mapview removeAnnotation:annotation];
}
}
[_mapview removeOverlays:[_mapview overlays]];
[self placePinsOnMap];
} else {
card.selected = NO;
}
}
}
AMapOverlay类是MKCircle的子类,只是保存坐标,半径值和一个位置对象,用于确定叠加应该是什么颜色。我在AMapOverlay类中重写了boundingMapRect:
- (MKMapRect)boundingMapRect {
MKMapPoint upperLeft = MKMapPointForCoordinate(self.coordinate);
MKMapRect bounds = MKMapRectMake(upperLeft.x, upperLeft.y, self.radius*2, self.radius*2);
return bounds;
}
重申我的问题是:第一次加载具有地图视图的控制器时,一切都很好。我看到了注释以及它们的叠加层。当用户选择新项目时,将删除旧注释和叠加,并且新注释将与叠加层一起添加,但不会显示叠加层。
有没有人知道为什么会这样?