MKAnnotation没有响应

我正在地图上显示几个引脚,如下所示:

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 )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]; 

但是,当我点击每个引脚时,我的屏幕上没有显示带有细节的气泡! 有人经历过同样的事吗?

仅仅实现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方法。