ios 一步一步學會自訂地圖吹出框(CalloutView)-->(百度地圖,高德地圖,google地圖)

來源:互聯網
上載者:User
 ios 一步一步學會自訂地圖吹出框(CalloutView)-->(百度地圖,高德地圖,google地圖) 高德地圖 google地圖 百度地圖 吹出框 自訂




前言


在ios上邊使用地圖庫的同學肯定遇到過這樣的問題:吹出框只能設定title和subtitle和左右的view,不管是百度地圖還是高德地圖還是內建的google地圖,只提供了這四個屬性,如果想添加更多的view,只能自訂。可是,類庫只能看到.h檔案,.m都看不到,這讓新手比較蛋疼,龐大的地圖類庫一時半會摸不著頭腦,從頭再學還需要時間,本文就教大家快速製作一個屬於自己的 CalloutView。等你一步一步調通後,再回過頭來使用系統內建的方法設定callout,就會領悟這個過程。




本文


Xcode版本:4.6.1


SDK版本:6.0 


百度地圖版本:1.2.2(關於地圖不必糾結,無論是百度還是高德還是google都是基於系統的MapKit,都是一樣的)


demo模式:非ARC,使用storyboard。


demo資源:

http://download.csdn.net/detail/mad1989/5252037

Step1

建立demo,並添加百度地圖的靜態類庫,helloword能顯示mapview


關於這一步我專門寫了教程,這裡就不再贅述,同樣,關於如何使用內建的BMKPointAnnotation添加一個marker,我也不再說了,如果連這個你都不會,那麼先去官網看一下基本教程。


Step2

實現三個委託方法:

這個方法類似tableview添加cell,都是建立annotation

[cpp] view plain copy #pragma mark   #pragma mark - BMKMapview delegate   -(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation;  


這個方法在點擊地圖marker時所觸發(並顯示callout)
[cpp] view plain copy -(void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view;  


這個方法在點擊地圖任意位置,相當於隱藏callout

[cpp] view plain copy -(void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view;  



原理:地圖上的marker是在viewForAnnoation裡建立的,同時也會隱含的為我們建立一個CalloutView,就是內建的吹出框,只是我們看不到源碼。其實這個吹出框(CalloutView)也是一個annotation,也會在viewForAnnotation裡被建立,他的座標應該和這個點的marker座標一樣,只要明白了這一點,就行了,marker和吹出框是兩個不同的annotation,他們有同樣的coordinate。


Step3

自訂一個Annotation,為了簡單方便,我就直接繼承了mapview內建的BMKPointAnnotation,這是一個經典的圖釘marker。

(百度地圖,高德地圖,google地圖)">
(百度地圖,高德地圖,google地圖)">

在這裡我添加了一個Dictionary屬性,目的是為了自訂的CalloutView吹出框顯示內容賦值,一會就明白了。



Step4

添加自訂Annotation到mapview

[cpp] view plain copy //添加自訂Annotation    CLLocationCoordinate2D center = {39.91669,116.39716};      CustomPointAnnotation *pointAnnotation = [[CustomPointAnnotation alloc] init];   pointAnnotation.title = @"我是中國人";//因為繼承了BMKPointAnnotation,所以這些title,subtitle都可以設定   pointAnnotation.subtitle = @"我愛自己的祖國";      pointAnnotation.coordinate = center;   [mymapview addAnnotation:pointAnnotation];   [pointAnnotation release];  
在viewForanntion裡,由於我對marker沒太大要求,直接使用了BMKPinAnnotationView(圖釘),簡單設定image屬性為自己需要的表徵圖,如下所示:

(百度地圖,高德地圖,google地圖)">
(百度地圖,高德地圖,google地圖)">

展示一個效果圖:

(百度地圖,高德地圖,google地圖)">


(百度地圖,高德地圖,google地圖)">

顯然CalloutView只能設定title和subtitle,無法滿足我們的要求,那麼繼續下一步。


Step5

建立一個(自訂的CalloutView)的Annotation,相當於顯示calloutView的annotation。

[注意] 繼承自NSObject<BMKAnnotation>

CalloutMapAnnotation.h

[cpp] view plain copy #import <Foundation/Foundation.h>   #import "BMapKit.h"      @interface CalloutMapAnnotation : NSObject<BMKAnnotation>         @property (nonatomic) CLLocationDegrees latitude;   @property (nonatomic) CLLocationDegrees longitude;         @property(retain,nonatomic) NSDictionary *locationInfo;//callout吹出框要顯示的各資訊            - (id)initWithLatitude:(CLLocationDegrees)lat andLongitude:(CLLocationDegrees)lon;        

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.