3

MKPolygon次のコードを使用してレンダリングしようとしています。

NSMutableArray *overlays = [NSMutableArray array];

        for (NSDictionary *state in states) {
            NSArray *points = [state valueForKeyPath:@"point"];

            NSInteger numberOfCoordinates = [points count];
            CLLocationCoordinate2D *polygonPoints = malloc(numberOfCoordinates * sizeof(CLLocationCoordinate2D));

            NSInteger index = 0;
            for (NSDictionary *pointDict in points) {
                polygonPoints[index] = CLLocationCoordinate2DMake([[pointDict valueForKeyPath:@"latitude"] floatValue], [[pointDict valueForKeyPath:@"longitude"] floatValue]);
                index++;
            }

            MKPolygon *overlayPolygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates];
            overlayPolygon.title = [state valueForKey:@"name"];

            [overlays addObject:overlayPolygon];

            free(polygonPoints);
        }
[self.stateMapView addOverlays:overlays];

次のコードを使用して、ストロークと塗りつぶしの色を指​​定しました。

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(10_9, 7_0);
{
    if ([overlay isKindOfClass:[MKPolygon class]])
    {
        MKPolygonRenderer *pv = [[MKPolygonRenderer alloc] initWithPolygon:overlay];

        pv.fillColor = [UIColor redColor];
        pv.strokeColor = [UIColor blackColor];

        return pv;
    }

    return nil;
}

タイトルをレンダリングするために何かをする必要がありますか? 構成などを有効にする必要があると思いますが、初めてですMapView。または、作成する必要がありますUILabelか?

4

1 に答える 1

4

オーバーレイは、注釈のように (実際には吹き出しで)タイトルを自動的に表示しないため、「実行する必要がある」ことや、有効にできる構成はありません。

オーバーレイにタイトルを表示する簡単な回避策は、お勧めのように、UILabel.
ただし、これは、各オーバーレイの中心に配置さ れる注釈ビューUILabelに追加する必要があります。

この方法の小さな欠点 (またはそうではない) は、タイトルがマップのズームに合わせてスケーリングされないことです。同じサイズのままで、最終的に衝突して他のタイトルと重なる可能性があります (ただし、これで問題ない場合があります)。 )。

このアプローチを実装するには:

  1. オーバーレイごとに注釈を追加し (addAnnotation:またはを使用addAnnotations:)、coordinateをオーバーレイのおおよその中心に、titleをオーバーレイのタイトルに設定します。

    はと両方のプロトコルをMKPolygon実装しているため、オーバーレイごとに別個のアノテーション クラスまたは別個のオブジェクトを作成する必要は必ずしもないことに 注意してください。は、そのプロパティを多角形のおおよその中心に自動的に設定するため、何も計算する必要はありません。 オーバーレイ オブジェクト自体を注釈として追加するだけです。 それが以下の例です。MKOverlay MKAnnotationMKPolygoncoordinate

  2. mapView:viewForAnnotation:デリゲート メソッドを実装し、を表示するMKAnnotationViewを含むを作成します。UILabeltitle

例:

[self.stateMapView addOverlays:overlays];

//After adding the overlays as "overlays",
//also add them as "annotations"...
[self.stateMapView addAnnotations:overlays];


//Implement the viewForAnnotation delegate method...
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        //show default blue dot for user location...
        return nil;
    }

    static NSString *reuseId = @"ann";
    MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (av == nil)
    {
        av = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];
        av.canShowCallout = NO;

        //add a UILabel in the view itself to show the title...
        UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
        titleLabel.tag = 42;
        titleLabel.backgroundColor = [UIColor clearColor];
        titleLabel.textColor = [UIColor blackColor];
        titleLabel.font = [UIFont boldSystemFontOfSize:16];
        titleLabel.textAlignment = NSTextAlignmentCenter;
        titleLabel.minimumScaleFactor = 0.5;
        [av addSubview:titleLabel];
        av.frame = titleLabel.frame;
    }
    else
    {
        av.annotation = annotation;
    }

    //find the UILabel and set the title HERE
    //so that it gets set whether we're re-using a view or not...
    UILabel *titleLabel = (UILabel *)[av viewWithTag:42];
    titleLabel.text = annotation.title;

    return av;
}

もう 1 つの方法は、カスタム オーバーレイ レンダラーを作成し、すべての描画 (ポリゴン ライン、ストロークの色、塗りつぶしの色、およびテキスト) を自分で行うことです。実装方法のアイデアについては、「円オーバーレイでテキストを描画する」および「パス描画を使用してテキストを追加する方法はありますか」を参照してください。

于 2014-03-30T13:10:29.397 に答える