2

我在地图上显示几个图钉,如下所示:

for (int i = 0; i < points.count; i++) {
    if([[[points objectAtIndex:i] objectForKey:@"lat"] class] != [NSNull class]) {
        southWest.latitude = MAX(southWest.latitude , [[[points objectAtIndex:i] objectForKey:@"lat"] doubleValue]);
        southWest.longitude = MIN(southWest.longitude, [[[points objectAtIndex:i] objectForKey:@"lon"] doubleValue]);
        northEast.latitude = MIN(northEast.latitude, [[[points objectAtIndex:i] objectForKey:@"lat"] doubleValue]);
        northEast.longitude = MAX(northEast.longitude, [[[points objectAtIndex:i] objectForKey:@"lon"] doubleValue]);

        pin.latitude = [[[points objectAtIndex:i] objectForKey:@"lat"] doubleValue];
        pin.longitude = [[[points objectAtIndex:i] objectForKey:@"lon"] doubleValue];
        CarPin *cPin = [[CarPin alloc] initWithName:[[self.brain.cars objectAtIndex:i] objectForKey:@"name"] state:[self getStateStringFor:[[[points objectAtIndex:i] objectForKey:@"state"] intValue]] coordinate:pin];
        cPin.state = [[[points objectAtIndex:i] objectForKey:@"state"] intValue];
        cPin.carID = [[points objectAtIndex:i] objectForKey:@"objekt_id"];
        [self.mapView addAnnotation:cPin];
    }
}

CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude];
CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude];
CLLocationDistance meters = [locSouthWest distanceFromLocation:locNorthEast];

MKCoordinateRegion region;
region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0;
region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0;
region.span.latitudeDelta = meters / 111319.5;
region.span.longitudeDelta = 0.0;

[self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];

然后我像这样选择每个引脚的“外观”:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
static NSString *identifier = @"CarPin";
if ([annotation isKindOfClass:[CarPin class]]) {
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (annotationView == nil) {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    } else {
        annotationView.annotation = annotation;
    }
    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    if (((CarPin *)annotation).state == 1) {
        annotationView.pinColor = MKPinAnnotationColorGreen;
    } else {
        annotationView.pinColor = MKPinAnnotationColorRed;
    }
    return annotationView;
}
return nil;
}

我还设置了委托

[self.mapView setDelegate:self];

但是,当我点击每个图钉时,屏幕上没有显示带有详细信息的气泡!有没有人有同样的经历?

4

1 回答 1

2

仅仅实现title属性是不够的。
您必须确保它title没有返回nil或空白。
如果是,即使canShowCallout设置为,注释视图也不会显示标注YES


与您的问题无关,但与此行有关:

region.span.latitudeDelta = meters / 111319.5;

至少出于三个原因,不建议这样做,也没有必要这样做:

  • 计算两个角之间的米距(您有纬度和经度的度数,然后将这些米转换回度数)是不必要的,因为latitudeDeltalongitudeDelta只是顶部/底部或左/右之间的度数差异。所以你所要做的就是:

    region.span.latitudeDelta = fabs(southWest.latitude - northEast.latitude);
    

    这是我在您的情况下建议的更改。

  • 将米转换为度 ( ) 所除以的值111319.5仅在赤道处准确。

  • 如果要根据米指定区域,而不是手动计算跨度,使用内置MKCoordinateRegionMakeWithDistance函数会更好、更容易:

    CLLocationCoordinate2D center = CLLocationCoordinate2DMake (lat, long);
    CLLocationDistance latMeters = 5000;  //5 km
    CLLocationDistance lonMeters = 5000;  //5 km
    MKCoordinateRegion region 
        = MKCoordinateRegionMakeWithDistance (center, latMeters, lonMeters);
    


此外,在您的情况下,调用regionThatFits是不必要的,因为setRegion无论您通过什么区域,它都会自行执行此操作。regionThatFits当您想知道(而不实际更改区域)地图视图会将区域调整为给定特定区域时,使用该方法。

于 2012-08-30T02:30:06.110 回答