MkannotationViewのサブクラス
-
10-10-2019 - |
質問
mkannotationViewクラスのサブクラスを知っている人がいるのではないかと思っていました。リンゴのドキュメントでは、1つの例はmkpinannotationViewだと言っているので、デバイスの現在の場所を追跡するために使用されるような他の事前に作成されたサブクラスがあるかどうか疑問に思っていました。誰かがMkannotationViewクラスの私自身のサブクラスを作成するためのヒントを持っている場合、それは素晴らしいことです。
ありがとう、バブスター
解決
私は他のテンプレートを知りませんが、それはそれらが存在しないという意味ではありません。 :)
とにかく、ここにカスタムのものを作成する方法があります:に準拠した新しいクラスを作成します MKAnnotation
プロトコル。タイプの2つのインスタンス変数が必要です NSString*
名前が付けられました title
と subtitle
タイプの1つ CLLocationCoordinate2D
名前付き座標と適切なセッターメソッド(プロパティなど)。これらの文字列はコールアウトに表示されます。 MapViewの代表者で、メソッドを実装してください -mapView:viewForAnnotation:
uitableviewのためにDataSourceを実装するのと同様の方法で。つまり、識別子によってアノテーションビューをデキューにし、新しいプロパティを設定します(例:適切なアクセサリビュー用のタイプuibuttontypedetaildisclosureのボタン)。オフセットの下に表示する画像を追加する必要があります。を使用するだけです image
mkannotationViewのプロパティ。カスタム画像の中心は指定された座標に配置されるため、オフセットを提供することができます。 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;
}
他のヒント
誰かがまだこれに興味を持っている場合に備えて:
ここで説明するように、Objective-C Runtime関数を使用してクラスのすべてのサブクラスを取得できます。 http://cocoawithlove.com/2010/01/getting-subclasses-of-objective-class.html
MkannotationViewから継承する他のクラスは次のとおりです。
mktransitcalloutview、mkadannotationview、mkuserlocationview、mkuserlocationbreadcrumbview、およびmkpinannotationview
ここで、MkpinannotationViewは文書化されている唯一のものです。他のすべては、Appleが内部で使用するプライベートクラスです。