サブクラス化する必要はありませんMKPinAnnotationView
。ただそれを使用してください。カスタム動作を探している場合にのみ、サブクラス化する必要があります。ただし、viewForAnnotation
適切に構成できるように a を記述すると便利です。しかし、通常、標準の構成はMKPinAnnotationView
十分に単純であるため、サブクラス化は必要ありません。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"DroppedPin"];
annotationView.draggable = YES;
annotationView.canShowCallout = YES;
annotationView.animatesDrop = YES;
return annotationView;
}
そうは言っても、独自の注釈クラスを持つことは珍しくありません。少なくとも 2 つの理由でこれを行う可能性があります。
MKPlacemark
アノテーションのプロパティとしてリバース ジオコーディングを保持する場合があります。論理的には、ジオコーディングされた情報は、ビューではなく注釈のプロパティのように見えます。次に、ドロップされたピンのこのプロパティを照会placemark
して、他のビューに戻す必要がある情報を取得できます。
必要に応じて、プロパティを逆ジオコード検索するようにアノテーションを構成することもできますが、placemark
変更時にタイトルを逆ジオコードされたアドレスに変更することcoordinate
もできます。このようにして、ユーザーはマップ上でピンをドラッグ アンド ドロップしているときにリバース ジオコーディングに関するアクティブなフィードバックを取得しますが、コードは依然として非常に単純です。
したがって、次のような注釈クラスがある場合があります。
@interface DroppedAnnotation : NSObject <MKAnnotation>
@property (nonatomic, strong) MKPlacemark *placemark;
@property (nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subtitle;
@end
@implementation DroppedAnnotation
- (void)setCoordinate:(CLLocationCoordinate2D)coordinate
{
CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude
longitude:coordinate.longitude];
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
// do whatever you want here ... I'm just grabbing the first placemark
if ([placemarks count] > 0 && error == nil)
{
self.placemark = placemarks[0];
NSArray *formattedAddressLines = self.placemark.addressDictionary[@"FormattedAddressLines"];
self.title = [formattedAddressLines componentsJoinedByString:@", "];
}
}];
_coordinate = coordinate;
}
@end
そして、View Controller はこの新しいクラスを使用できます。
@property (nonatomic, weak) id<MKAnnotation> droppedAnnotation;
- (void)dropPin
{
// if we've already dropped a pin, remove it
if (self.droppedAnnotation)
[self.mapView removeAnnotation:self.droppedAnnotation];
// create new dropped pin
DroppedAnnotation *annotation = [[DroppedAnnotation alloc] init];
annotation.coordinate = self.mapView.centerCoordinate;
annotation.title = @"Dropped pin"; // initialize the title
[self.mapView addAnnotation:annotation];
self.droppedAnnotation = annotation;
}
明確にするために、独自の注釈クラスは必要ありません。MKPointAnnotation
たとえば、標準を使用できます。ただし、View Controller は呼び出しを維持し、逆ジオコーディングされた情報自体を追跡する必要があります。カスタム注釈クラスを使用すると、コードが少しすっきりして論理的になると思います。