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이랑은 조금 달르지만, 언제나 그렇듯이 알고 나면 별것 없다. 


+ Recent posts