0

MKAnnotationView のスタイルを変更する方法はありますか (番号付きの赤いラベルから番号付きの緑色のラベルに変更するなど)。

ターゲットからの距離に応じてこのスタイルを変更したい。私の注釈はユーザーと一緒に動いています。

「点滅」が発生するため、注釈の削除/追加を使用したくありません。なんとかできるのでしょうか?

更新

私はコードを追加しています、私は今それをやっています

MKAnnotationView *av = [mapView viewForAnnotation:an];

if ([data->type isMemberOfClass:[UserAnnotationImage class]])
{
    UIImage *img = [UIImage imageNamed: ((UserAnnotationImage *)data->type)->url];
    [av setImage:img];
}
else if ([data->type isMemberOfClass:[UserAnnotationLabel class]])
{

    UIView * v = [av viewWithTag:0];
    v = ((UserAnnotationLabel *)data->type)->lbl;

    av.frame = ((UserAnnotationLabel *)data->type)->lbl.frame;
}
else if ([data->type isMemberOfClass:[UserAnnotationView class]])
{

    UIView * v = [av viewWithTag:0];
    v = ((UserAnnotationView *)data->type)->view;
    av.frame = ((UserAnnotationView *)data->type)->view.frame;
}

悲しいことに、それは機能しません:(

4

1 に答える 1

4

はい、基本的に注釈ビューへの参照を取得し、その内容を直接更新します。

別の方法として、カスタム注釈ビュー クラスがある場合は、注釈ビューに関心のある変更を監視させ (または外部の何かに伝えさせ)、それ自体を更新させることです。

MKAnnotationViewプレーンまたはを使用している場合、最初のアプローチはより簡単ですMKPinAnnotationView

ビューの変更が必要であることを検出した場合は、マップ ビューのviewForAnnotation インスタンス メソッドを呼び出して、ビューへの参照を取得します。viewForAnnotationこれは、デリゲート メソッド の呼び出しと同じではありません。

ビューへの参照を取得したら、必要に応じて変更でき、変更はすぐに表示されます。

重要な点は、デリゲート メソッドの外側でビューを更新するために使用するロジックと、デリゲート メソッド内にあるロジックがviewForAnnotation一致している必要があるということです。これは、デリゲート メソッドが後で (ビューを手動で更新した後) マップ ビューによって呼び出される可能性があり、そのときにコードが更新されたデータを考慮に入れる必要があるためです。

これを行う最善の方法は、デリゲート メソッドと手動でビューを更新する場所の両方で呼び出される共通のメソッドに、注釈ビューの構築コードを含めることです。

注釈ビューimage.

カスタム アノテーション ビュー クラスを使用してビューを更新する例(ほとんどがアプローチのアイデア) については、 iPad Mapkit -ビューのピンの色を定期的に更新する「現在の場所」のタイトルを変更する (緑、紫、赤、緑、紫)を参照してください。 、赤など)。


コードが機能しない理由を説明するには、コードに不明な点が多すぎます。例えば:

  • とはdata? 注釈固有ですか(関連していanますか)?とはtype? 注釈がマップに追加された後に変更されますか?
  • これらのビューに表示したい基礎となるデータだけではなく、dataビュー オブジェクト全体をUILabelorのように保存するのはなぜですか?UIView
  • imageNamed画像がプロジェクト内のリソースである必要があります (任意の URL ではありません)。
  • のタグを使用しないでください0(これはすべてのビューのデフォルトです)。から番号付けを開始し1ます。
  • viewWithTag を使用してビューを取得しますが、すぐに別のビューに置き換えます。


代わりに、より詳細だが単純な(r)を示します...

MKAnnotationこれらのプロパティ (座標、タイトル、サブタイトルに加えて) を持つ注釈クラス ( を実装するクラス) があるとします。

@property (nonatomic, assign) BOOL haveImage;
@property (nonatomic, copy) NSString *labelText;
@property (nonatomic, copy) NSString *imageName;
@property (nonatomic, assign) CLLocationDistance distanceFromTarget;

上記の「重要な点」 (viewForAnnotationデリゲート メソッドとビュー更新コードが同じロジックを使用する必要があること) に対処するために、注釈ビューを渡されるメソッドを作成し、注釈のプロパティに基づいて必要に応じて構成します。 . viewForAnnotationこのメソッドは、デリゲート メソッドと、注釈のプロパティが変更されたときにビューを手動で更新するコードの両方によって呼び出されます。

この例では、アノテーション ビューに画像が表示され、それ以外の場合haveImageYESラベルが表示されるようにしました。さらに、ラベルの背景色は以下に基づいていdistanceFromTargetます。

-(void)configureAnnotationView:(MKAnnotationView *)av
{
    MyAnnotationClass *myAnn = (MyAnnotationClass *)av.annotation;

    UILabel *labelView = (UILabel *)[av viewWithTag:1];

    if (myAnn.haveImage)
    {
        //show image and remove label...
        av.image = [UIImage imageNamed:myAnn.imageName];
        [labelView removeFromSuperview];
    }
    else
    {
        //remove image and show label...
        av.image = nil;

        if (labelView == nil)
        {
            //create and add label...
            labelView = [[[UILabel alloc] 
                initWithFrame:CGRectMake(0, 0, 50, 30)] autorelease];
            labelView.tag = 1;
            labelView.textColor = [UIColor whiteColor];
            [av addSubview:labelView];
        }

        if (myAnn.distanceFromTarget > 100)
            labelView.backgroundColor = [UIColor redColor];
        else
            labelView.backgroundColor = [UIColor greenColor];

        labelView.text = myAnn.labelText;
    }
}

デリゲート メソッドは次のviewForAnnotationようになります。

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{
    if ([annotation isKindOfClass:[MyAnnotationClass class]])
    {
        static NSString *myAnnId = @"myann";
        MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:myAnnId];
        if (av == nil)
        {
            av = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:myAnnId] autorelease];
        }
        else
        {
            av.annotation = annotation;
        }

        [self configureAnnotationView:av];

        return av;
    }

    return nil;
}

最後に、注釈のプロパティが変更され、注釈ビューを更新する場所のコードは次のようになります。

ann.coordinate = someNewCoordinate;
ann.distanceFromTarget = theDistanceFromTarget;
ann.labelText = someNewText;
ann.haveImage = YES or NO;
ann.imageName = someImageName;

MKAnnotationView *av = [mapView viewForAnnotation:ann];
[self configureAnnotationView:av];
于 2012-09-04T14:24:25.463 に答える