7

別の注釈 (ann1) をタップすると、近くにある二次注釈 (ann2) を追加する方法があります。しかし、まったく同じ注釈 (ann1) を選択解除して再選択すると、ann2 がそれ自体を再作成し、再び追加されます。注釈がマップ上に既に存在するかどうかを確認する方法はありますか?存在する場合は何もしません。それ以外の場合は、新しい注釈を追加します。私はすでにこれをチェックしました: MapView で重複注釈を制限しますが、役に立ちませんでした..アドバイスをいただければ幸いです。これは私がこれまでに持っているものです:

    fixedLocationsPin *pin = [[fixedLocationsPin alloc] init];
        pin.title = [NSString stringWithFormat:@"%@",nearestPlace];
        pin.subtitle = pinSubtitle;
        pin.coordinate = CLLocationCoordinate2DMake(newObject.lat, newObject.lon);

        for (fixedLocationsPin *pins in mapView.annotations) {
            if (MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate (pins.coordinate))) {
                NSLog(@"already in map");
            }else{
                [mapView addAnnotation:pin];
            }

この場合、既にマップ上にログを取得していますが、マップに追加された注釈のドロップ アニメーションも取得しています。何か案は?

前もって感謝します..

4

5 に答える 5

4

forループは、注釈が画面に表示されているかどうかをチェックしていません。ピンの座標が現在表示領域内にあるかどうかをチェックしています。pinオブジェクトがすでに存在するかどうかをチェックしていたとしても、それmapView.annotationsが真になることはありません。数行前に作成したばかりpinなので、のと同じオブジェクトになることはできませんmapView.annotations。それは同じ座標とタイトルを持っているかもしれません、そしてそれはあなたがチェックする必要があるものです:

bool found = false;
for (fixedLocationsPin *existingPin in mapView.annotations)
{
  if (([existingPin.title isEqualToString:pin.title] && 
       (existingPin.coordinate.latitude == pin.coordinate.latitude)
       (existingPin.coordinate.longitude == pin.coordinate.longitude))
  { 
    NSLog(@"already in map");
    found = true;
    break;
  }
}    
if (!found)
{
    [mapView addAnnotation:pin];
} 
于 2013-02-28T20:03:44.783 に答える
1

注釈配列はマップオブジェクトに存在するため、確認するだけです

if ( yourmap.annotations.count==0)
{
NSLog(@"no annotations");
}
于 2016-02-01T11:01:01.943 に答える
1
NSNumber *latCord = [row valueForKey:@"latitude"];
NSNumber *longCord = [row valueForKey:@"longitude"];
NSString *title = [row valueForKey:@"name"];

CLLocationCoordinate2D coord;
coord.latitude = latCord.doubleValue;
coord.longitude = longCord.doubleValue;
MapAnnotation *annotation = [[MapAnnotation alloc]initWithCoordinate:coord withTitle:title];
if([mkMapView.annotations containsObject:annotation]==YES){
    //add codes here if the map contains the annotation.
}else {
    //add codes here if the annotation does not exist in the map.
}
于 2016-02-11T08:33:56.360 に答える
-1

クレイグの答えに対する私のコメントに続いて、解決策は次のようになると思います:

import MapKit

extension MKMapView {

    func containsAnnotation(annotation: MKAnnotation) -> Bool {

        if let existingAnnotations = self.annotations as? [MKAnnotation] {
            for existingAnnotation in existingAnnotations {
                if existingAnnotation.title == annotation.title
                && existingAnnotation.coordinate.latitude == annotation.coordinate.latitude
                && existingAnnotation.coordinate.longitude == annotation.coordinate.longitude {
                  return true
                }
            }
        }
        return false
    }
}

このコードを使用すると、mapView に特定の注釈が含まれているかどうかを確認できます。すべての注釈の「for」ループでこれを使用します。

for annotation in annotations {
  if mapView.containsAnnotation(annotation) {
    // do nothing
  } else {
    mapView.addAnnotation(annotation)
  }

PS: mapView に新しい注釈を追加する必要がある場合、これはうまく機能します。ただし、エントリも削除する必要がある場合は、反対のことを行う必要がある場合があります。既存の各注釈が新しい注釈の配列に存在することを確認します。そうでない場合は、削除します。または、すべてを削除して再度追加することもできます (ただし、変更がアニメーション化されます ...)

于 2015-08-21T21:17:57.450 に答える