1. MapView 보여주기
Interface Builder 상에서, MapView를 집어 놓고, Run!! 하면 다음과 같은 에러가 난다.
그 이유인 즉슨, MapView는 MapKit이라는 Framework에 소속되어 있고, 기본적으로
MapKit Framework은 링크 되어 있기 때문이다.
Add Existing Framework을 선택하여, Mapkit 을 추가 해주면. 짜잔하고 잘 나온다.
2. Annotation Pin 노출하기
- (void)addAnnotation:(id <MKAnnotation>)annotation;
MKMapView에 addAnnotation: Method를 통해 MapView에 Annotation Pin이 표기될 Data를 추가 할 수 있다.
일단 기본적으로 제공하는 MKPlaceMark Object를 생성해서, addAnnotation 해주면, 아래와 같이 Pin이 노출된다.
3. Annotation Draggable 하도록 하기.
// If YES and the underlying id<MKAnnotation> responds to setCoordinate:,
// the user will be able to drag this annotation view around the map.
@property (nonatomic, getter=isDraggable) BOOL draggable __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);
MKAnnotationView 의 Header를 살펴보면, draggable 이라는 변수가 있다.
여기서, 주의 할점은 addAnnotation으로 추가한 MKAnnotation을 Adopting하고 있는 Object가
setCoordinate: Message에 응답가능해야 한다는것이다.
우리는 Annotation Object를 MKPlaceMark를 이용했는데, 애석하게도 MKPlaceMark Class는 setCoordinate: Message 에 응답하지 않는다.
@interface DraggableAnnotation : MKPlacemark {
}
@property (nonatomic, readwrite, assign) CLLocationCoordinate2D coordinate;
@end
MKPlacemark를 상속받는 DraggableAnnotation을 정의한다.
coordinate라는 변수는 MKPlacemark에 이미 존재 함으로 property 만 Override해준다.
그리고 ViewController에서 MKPlacemark를 사용했던 부분을 DraggableAnnotation을 사용하도록 수정한다.
MKAnnotationView의 draggable값은 기본으로 YES이지만, MKMapView에서 내부적으로 생성하는 MKAnnotationView는 Draggable=NO이다.
MKMapViewDelegate의 Method를 하나 구현한다.
- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation {
NSString *reuseIdentifier = @"abcdefg";
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[aMapView dequeueReusableAnnotationViewWithIdentifier:reuseIdentifier];
if(annotationView == nil) {
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
annotationView.draggable = YES;
annotationView.canShowCallout = YES;
}
[annotationView setAnnotation:annotation];
return annotationView;
}
기본적인 Pin을 보여주는 MKPinAnnotationView Object를 하나 만들고,
draggable 을 YES로 세팅해주면, 이제 원하는대로 Pin이 Dragging된다.
MKMapView의 구조가 UIKit이랑은 조금 달르지만, 언제나 그렇듯이 알고 나면 별것 없다.