6

MKAnnotationViewクラスのサブクラスを知っている人はいないかと思いました。リンゴのドキュメントでは、1つの例がMKPinAnnotationViewであると言われているので、デバイスの現在の場所を追跡するために使用されるような、他の事前に作成されたサブクラスがあるかどうか疑問に思いました。MKAnnotationViewクラスの独自のサブクラスを作成するためのヒントがあれば、それも素晴らしいです。

ありがとう、バブスター

4

2 に答える 2

10

誰かがまだこれに興味がある場合:

ここで説明するように、Objective-Cランタイム関数を使用してクラスのすべてのサブクラスを取得できます:http://cocoawithlove.com/2010/01/getting-subclasses-of-objective-c-class.html

MKAnnotationViewから継承する他のクラスは次のとおりです。

MKTransitCalloutView、MKAdAnnotationView、MKUserLocationView、MKUserLocationBreadCrumbView、およびMKPinAnnotationView

ここで、MKPinAnnotationViewは文書化されている唯一のものです。その他はすべて、Appleが内部で使用するプライベートクラスです。

于 2011-04-29T01:35:49.263 に答える
7

他のテンプレートは知りませんが、存在しないという意味ではありません。:)

とにかく、カスタムクラスを作成する方法は次のとおりMKAnnotationです。プロトコルに準拠した新しいクラスを作成します。とというタイプの2つのインスタンス変数と、coordinateという名前のタイプの1つと、適切なセッターメソッド(プロパティなど)が必要にNSString*なります。これらの文字列は、コールアウトに表示されます。mapViewのデリゲートで、UITableViewのデータソースを実装するのと同様の方法でメソッドを実装します。つまり、annotationViewを識別子でデキューし、新しいプロパティを設定します(たとえば、右側のアクセサリビューのタイプUIButtonTypeDetailDisclosureのボタン)。オフセットの下に表示する画像を追加する必要があります。使用するだけですtitlesubtitleCLLocationCoordinate2D-mapView:viewForAnnotation:imageMKAnnotationViewのプロパティ。カスタム画像の中心は指定された座標に配置されるため、オフセットを指定することをお勧めします。aView.centerOffset = CGPointMake(0, -20)

サンプルコードは次のとおりです。

- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation {
    // reuse a view, if one exists
    MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"];

    // create a new view else
    if (!aView) {
        aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"];
    }

    // now configure the view
    aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [(UIButton*)aView.rightCalloutAccessoryView addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
    aView.canShowCallout = YES;
    aView.enabled = YES;
    aView.image = [UIImage imageNamed:@"green_pin.png"];
    aView.centerOffset = CGPointMake(0, -20);

    return aView;
}
于 2010-10-22T08:13:03.237 に答える