很多項(xiàng)目需求需要實(shí)現(xiàn)自定義大頭針和自定義的CalloutAnnotationView,這篇文章或許對(duì)很多需要的童鞋有幫助贬芥!先看看我做的效果圖
這里面的大頭針和CalloutAnnotationView都是和系統(tǒng)的不一樣赶促,應(yīng)該能夠應(yīng)付大部分的場景社付,廢話不多說進(jìn)入正題。
首先童靴要先清楚這個(gè)MKAnnotation和MKAnnotationView兩者之間的關(guān)系燃箭,如果這個(gè)沒弄明白那就很難理解冲呢。我說說自己的理解--就是model和view的關(guān)系,大家可以試著琢磨下應(yīng)該不能理解招狸。上面的效果圖中不管是橙色的紅色的 還是彈出的不規(guī)則圖形其實(shí)都是大頭針,大家在使用蘋果系統(tǒng)的地圖時(shí)候都知道 大頭針有點(diǎn)擊事件的.第二要把MKMapView當(dāng)做平時(shí)經(jīng)常做的UITableView理解和使用敬拓。第三就是自己動(dòng)手。
先看看 第一層大頭針及上圖中紅色 藍(lán)色包括文字的大頭針.這些地圖的數(shù)據(jù)應(yīng)該都是服務(wù)器獲取的裙戏,則建立一個(gè)model接收這些數(shù)據(jù) 我這里定義了一個(gè)Location模型接收數(shù)據(jù)
現(xiàn)在數(shù)據(jù)有了 那么就得和大頭針聯(lián)系起來了.怎么聯(lián)系呢乘凸?這里先不說,我們先來看看兩個(gè)函數(shù)的意義累榜,
上面我就說了 要把自定義大頭針的使用和UITableView來理解营勤,那么不難理解 上面第一個(gè)函數(shù)對(duì)應(yīng)的就是
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath\ *)indexPath
第二個(gè)函數(shù)就不用我說了 點(diǎn)擊事件。既然現(xiàn)在能夠明白點(diǎn)了那就進(jìn)入正題壹罚,我們既然可以把大頭針當(dāng)自定義cell來使用冀偶,那它肯定是可以重復(fù)用的,這個(gè)可以看下官方的API文檔里面寫的很清楚渔嚷,那我們來顯示第一層的自定義大頭針。
上面的模型我們已經(jīng)有了稠曼,現(xiàn)在就得和MKAnnotation產(chǎn)生關(guān)聯(lián)形病,既然是自定義那么肯定要?jiǎng)?chuàng)建一個(gè)繼承MKAnnotation的類 (原生的MKAnnotation只有三個(gè)屬性給你調(diào)用肯定無法滿足實(shí)際的項(xiàng)目需求)
.m文件里面 直接set方法讓模型和這個(gè)ZLocationAnnotation賦值客年,代碼就懶得附上了。
通過上面截圖的兩個(gè)方法 我們應(yīng)該也看的出來 最終用戶看到了肯定是MKAnnotationView漠吻,前面也說了MKAnnotation和MKAnnotationView就是model和view的關(guān)系量瓜,現(xiàn)在model已經(jīng)有了,那就需要和MKAnnotationView進(jìn)行關(guān)聯(lián)。我這里是一個(gè)簡單自定義View通過xib拖線途乃。為什么我不直接自定義繼承MKAnnotationView的view呢绍傲?很簡單,沒有可以直接拖出一個(gè)MKAnnotationView啊耍共,這里提供下自定義View加載xib的方法是
[[[NSBundle mainBundle] loadNibNamed:@"xib名" owner:nil options:nil] lastObject];
好 現(xiàn)在界面也已經(jīng)搭建了 剛剛說了xcode沒辦法直接拖出一個(gè)MKAnnotationView烫饼,那只能讓剛剛自定義view 和MKAnnotationView產(chǎn)生關(guān)聯(lián),那我們就得創(chuàng)建一個(gè)繼承MKAnnotationView的view试读,我這里是這么定義的
要顯示剛剛xib自定義的View 就在初始化方法里面加進(jìn)去就可以了杠纵。這里要注意一點(diǎn),可能很多童靴遇到這個(gè)問題 點(diǎn)擊自定義的大頭針沒效果钩骇,有的重寫hit方法比藻,我采取第二種方法:
大家可以看到 我將MKAnnotationView的bounds設(shè)置成和自定義的大頭針的View一樣大小,為什么很多童靴遇到大頭針點(diǎn)擊無效呢?就是因?yàn)樗目牲c(diǎn)擊范圍比較小倘屹,后面的兩個(gè)方法就是簡單的初始化賦值操作银亲。在配合剛剛說的顯示MKAnnotationView的代理方法 當(dāng)然 你得要調(diào)用 加載方法 addAnnotation才行。
到此纽匙,你的自定義大頭針顯示是沒有問題了务蝠,至于自定義CalloutAnnotationView我下一集講。
謝謝哄辣!