en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

1.09.2011

MapView 地圖註解大頭針 Pin 的相關設定

 

延續上一篇在 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;






12 則留言:

  1. 不好意思可以請教你!!有否可能只換一個大頭針的顏色??

    回覆刪除
    回覆
    1. 鈞 您好:

      關於 (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation 這個函式,我記得映像中他是會「逐步」匯出每一個大頭針,所以,可以利用這個特性抓到你要的大頭針在繪製不同的顏色,這裡可以裡用 if 判斷式來達成,希望有幫助到您。

      刪除
    2. 謝謝!!我弄出來了XD~~~~太感謝你了

      刪除
  2. 匿名4/02/2013

    您好 請問一下

    我定義一個自身位置和多個大頭針,每個大頭針內有一個按鈕觸發事件開啟內建的導航,但是觸發事件只能顯示第一個位置,請問該如何解決呢?

    目前是卡在不知道要如何判斷是點擊哪個大頭針。

    回覆刪除
    回覆
    1. 您好:

      在 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

      刪除
  3. 匿名4/14/2013

    你好:

    感謝你的幫助,問題已經解決了

    最近期中考,一直忘記上來表達謝意,在此獻上十二萬分歉意。

    最後再次感謝您給予的提示,謝謝!

    回覆刪除
    回覆
    1. 您好:

      你太客氣了,很高興你的問題可以順利解決!

      刪除
  4. 匿名7/31/2013

    不好意思我想請問一下
    我從資料庫上抓下了一些點並且新增了許多pin
    在新增pin 的時候我都給了他們一些索引值
    但是進入下面這個之後
    (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation

    因為annotation是已經被鎖死的
    完全無法讀到我自行建立的MKAnnotation下的索引值的內容
    請問該怎麼傳值過去呢 ?
    謝謝您

    回覆刪除
    回覆
    1. 您好:

      你試試看 [annotation title] 或是 [annotation subtitle]

      這邊使用.是不會有東西的!

      另外要設定他的內容可以參考前一篇「在 MapView 上加入註解說明的大頭針 Pin」
      http://furnacedigital.blogspot.tw/2011/01/mapview-pin.html

      刪除
  5. 匿名7/31/2013

    您好,我試過用subtitle是可以傳值的
    但是我想傳送的是比較私密的資料
    也是後台在運作的資料
    在title或是subtitle上給人看到並不是很好

    有辦法在title和subtitle下可以正常使用
    而又有辦法傳資料的方法嗎
    謝謝您

    回覆刪除
  6. 匿名7/31/2013

    不好意思我稍微知道了,我是想要在註解右邊按下buttun之後得到那些值
    所以有了
    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;
    這個讓我操作,我會在去看一下網路上的文件,打擾了!

    回覆刪除
    回覆
    1. 您好:
      嗯嗯,不好意思沒有幫上忙!

      刪除