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プロパティを実装するだけでは十分ではありません。が返されたり空白になったり
していないことを確認する必要があります。そうである場合、が に設定されて いても、注釈ビューは吹き出しを表示しません。titlenil
canShowCalloutYES


あなたの問題とは関係ありませんが、この行に関して:

region.span.latitudeDelta = meters / 111319.5;

これは、少なくとも次の 3 つの理由から推奨されず、不要です。

  • 2 つのコーナー間のメートルの距離を計算する (緯度と経度を度単位で取得し、それらのメートルを度数latitudeDeltaに変換する) は不要ですlongitudeDelta。したがって、あなたがしなければならないことは次のとおりです。

    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 に答える