14

ユーザーがMKMapViewをズームアウトした場合、互いに近いMKAnnotationsが自動的に1つの「グループ」注釈にグループ化されるようにします。ユーザーがズームインした場合、「グループ」アノテーションは一意/元のアノテーションに再度分割する必要があります。

アップルはすでにiOS4Photos.appでこれを行っています

これを行うための一般的な「事前定義された」方法はありますか?

4

3 に答える 3

6

マップ上で 1500 以上の注釈を使用する通常の作業:

-(void)mapView:(MKMapView *)mapView_ regionDidChangeAnimated:(BOOL)animated
{
    NSMutableSet * coordSet = [[NSMutableSet alloc] init];

    for(id<MKAnnotation> an in mapView_.annotations)
    {
        if([an isKindOfClass:[MKUserLocation class]])
            continue;

        CGPoint point = [mapView_ convertCoordinate:an.coordinate toPointToView:nil];
        CGPoint roundedPoint;

        roundedPoint.x = roundf(point.x/10)*10;
        roundedPoint.y = roundf(point.y/10)*10;

        NSValue * value = [NSValue valueWithCGPoint:roundedPoint];

        MKAnnotationView * av = [mapView_ viewForAnnotation:an];

        if([coordSet containsObject:value])
        {
            av.hidden = YES;
        }
        else
        {
            [coordSet addObject:value];
            av.hidden = NO;
        }
    }

    [coordSet release];
}
于 2012-02-14T17:24:05.220 に答える
4

それは素晴らしいアイデアです。私は同様のアプリに取り組んでいます。コンセプトを実装してもかまいません:)。

私自身の能力の限りであなたの質問に答えるために、いいえ、これを行うための事前定義された方法はないと思います.

(iOS4 の写真アプリを見て) 私が思いつく最善の方法は、mapView:regionDidChangeAnimated:デリゲート メソッドを利用することです。ユーザーがスクロール/ズームするたびに、このメソッドが呼び出されます。

そのメソッド内で、ポイントがマージを検討するのに「十分に近い」かどうかを判断するための簡単なジオメトリ計算を行うことができます。それらが「マージ」されたら、一方または両方の注釈を削除し、両方への参照である同じ場所に別の注釈を戻します (MKAnnotation に準拠するだけでなく、注釈の NSArray であり、他の注釈や AnnotationCluster インスタンスなどを「分割」または「吸収」するためのメソッドも含まれています)。

「クイック ジオメトリ計算」とは、マップのスパンに対する 2 つのポイントの距離を意味し、それらの相対距離をマップ全体のスパンのパーセンテージで表したものです。

それが難しいのは、何百もの注釈がある場合です。二重ループを使用してそれを実装する良い方法をすぐには思いつかないからです。

どう思いますか?

于 2010-07-17T14:59:59.340 に答える