延續上一篇在 MapView 上加入註解說明的大頭針 Pin 的文章,在 ViewController.m 中加入下列程式碼,對 Map Pin 進行設定。
//建立MapPin時會呼叫的函式
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
//判斷Pin如果是目前位置就不修改
if ([annotation isKindOfClass:[MKUserLocation class]]) {
return nil;
}
MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:@"PinView"];
//設定顏色
pinView.pinColor = MKPinAnnotationColorGreen;
UIImage *image = [UIImage imageNamed:@"MapPin.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[image release];
//重設圖片大小與座標
imageView.frame = CGRectMake(0, 0, 30, 30);
//設定註解內的圖片
pinView.rightCalloutAccessoryView = imageView;
[imageView release];
//點擊時是否出現註解
pinView.canShowCallout = YES;
//是否可以被拖曳
pinView.animatesDrop = YES;
return pinView;
}
使用的圖片記得要放到專案的 Resources 內,註解除了放入圖片也可以放入 UIButton 來製作按鈕事件。
在這裡有一個很重要的地方,如果你已經鍵入上列程式碼,但是地圖上的註解大頭針並沒有變色或樣式,很有可能是沒有將 MapView 的代理指向自己,因此在繪製 MapPin 時才沒有呼叫到此函式,設定方式如下。
@interface MapPinViewController : UIViewController <MKMapViewDelegate> {
並在繪製 MapView 的地方加上以下程式碼。
//將MapView的代理設為自己
map.delegate = self;
不好意思可以請教你!!有否可能只換一個大頭針的顏色??
回覆刪除鈞 您好:
刪除關於 (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation 這個函式,我記得映像中他是會「逐步」匯出每一個大頭針,所以,可以利用這個特性抓到你要的大頭針在繪製不同的顏色,這裡可以裡用 if 判斷式來達成,希望有幫助到您。
謝謝!!我弄出來了XD~~~~太感謝你了
刪除您好 請問一下
回覆刪除我定義一個自身位置和多個大頭針,每個大頭針內有一個按鈕觸發事件開啟內建的導航,但是觸發事件只能顯示第一個位置,請問該如何解決呢?
目前是卡在不知道要如何判斷是點擊哪個大頭針。
您好:
刪除在 MKMapViewDelegate 中有定義一個函式,如下:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
它會在你點擊大頭針時觸發,你可以利用 tag 來辨別他們彼此,並且利用此 tag 當做參數餵給您自訂的函式來產生效果,當然也必須在建立每個大頭針時都給予他們不同的 tag,不知道這樣解釋您是否了解,至於 MKMapViewDelegate 來有哪些函式或是協定可用,你可以使用 command + 滑鼠左鍵來觀看。
ps:這篇文章真的很久了,現在也已經不是 google map了,但是其中的函式庫其實差異不大,如果您也同時在尋找 google map 的 api,可以參考以下這篇:
http://furnacedigital.blogspot.tw/2012/10/classicmap-google.html
你好:
回覆刪除感謝你的幫助,問題已經解決了
最近期中考,一直忘記上來表達謝意,在此獻上十二萬分歉意。
最後再次感謝您給予的提示,謝謝!
您好:
刪除你太客氣了,很高興你的問題可以順利解決!
不好意思我想請問一下
回覆刪除我從資料庫上抓下了一些點並且新增了許多pin
在新增pin 的時候我都給了他們一些索引值
但是進入下面這個之後
(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation
因為annotation是已經被鎖死的
完全無法讀到我自行建立的MKAnnotation下的索引值的內容
請問該怎麼傳值過去呢 ?
謝謝您
您好:
刪除你試試看 [annotation title] 或是 [annotation subtitle]
這邊使用.是不會有東西的!
另外要設定他的內容可以參考前一篇「在 MapView 上加入註解說明的大頭針 Pin」
http://furnacedigital.blogspot.tw/2011/01/mapview-pin.html
您好,我試過用subtitle是可以傳值的
回覆刪除但是我想傳送的是比較私密的資料
也是後台在運作的資料
在title或是subtitle上給人看到並不是很好
有辦法在title和subtitle下可以正常使用
而又有辦法傳資料的方法嗎
謝謝您
不好意思我稍微知道了,我是想要在註解右邊按下buttun之後得到那些值
回覆刪除所以有了
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;
這個讓我操作,我會在去看一下網路上的文件,打擾了!
您好:
刪除嗯嗯,不好意思沒有幫上忙!