實現(xiàn)效果
如圖:
需要引入 高德3D地圖SDK,高德搜索SDK歉闰,高德地圖基礎SDK辖众,需配置自己的高德地圖AppKey和對應的Boundle id。
項目demo是用pod集成的和敬,demo組織架構使用了MVC設計模式凹炸。自己封裝了高德地圖搜索管理類,拿去直接能用昼弟,用法也很簡單啤它,關于這個搜索的封裝,說明在http://www.reibang.com/p/d5a2ace2252d舱痘,里面含gitHub地址变骡。
框架結構
AddressSelectedController是地址搜索的界面,DDLocationReGeocode作為其Model模型芭逝,DDMapView是對地圖進行的一個抽離塌碌,整體采用MVC設計模式。其中DDSearchManager文件中是封裝好的搜索管理類旬盯。
各個部分的職能很明確台妆,這樣子寫代碼你會發(fā)現(xiàn)很簡單,看起來也不復雜胖翰,當然你如果非要在一個Controller里面即地圖又有搜索等等频丘,也行Who cares。
實現(xiàn)過程
AddressSelectedController.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import "DDLocationReGeocode.h"
/**
回調選則的位置信息
@param reGeocode 位置信息
@param error 錯誤碼
*/
typedef void(^DDLocationCompleteBlock)(DDLocationReGeocode *reGeocode, NSError *error);
@interface AddressSelectedController : UIViewController
//回調選中地址信息的block
@property (nonatomic, copy) DDLocationCompleteBlock completeBlock;
/*
傳入經(jīng)緯度度泡态,進行反地理編碼
*/
@property (nonatomic) CLLocationCoordinate2D currentCoordinate;
@end
這個界面可以從外傳入初始經(jīng)緯度,如果傳入了初始經(jīng)緯度則迂卢,地圖會直接移動到傳入的位置處并進行附近的興趣點搜索某弦,如果未傳入初始經(jīng)緯度桐汤,則地圖默認定位到用戶當前位置處。
DDLocationCompleteBlock是回調你選中地址信息的block靶壮,block里面回調了DDLocationReGeocode的對象reGeocode和NSError的錯誤碼怔毛,這里錯誤碼沒有定義,如有需要自己添加腾降。
當然也可以使用代理進行數(shù)據(jù)回調也是可以的拣度,都很好。
AddressSelectedController.m
實現(xiàn)文件中添加了地圖螃壤,tableView抗果,實現(xiàn)了各自的代理方法。移動地圖時進行逆地理編碼查詢POI點奸晴,取到興趣點后刷新列表冤馏。
DDLocationReGeocode.h
這個model里很簡單就是一些數(shù)據(jù),在MVC中Model的作用還是挺大的寄啼,這里沒能全部體現(xiàn)出來逮光,只是淡單純的儲存了一下數(shù)據(jù),作為數(shù)據(jù)傳輸?shù)闹黧w墩划。
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@interface DDLocationReGeocode : NSObject
@property (nonatomic, copy) NSString *city;
@property (nonatomic, copy) NSString *cityCode;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *address;
@property (nonatomic ) CLLocationCoordinate2D coordinate;
@end
DDMapView.h
這個DDMapView里面也很簡單就一個地圖涕刚,中間放了一個圖片。對于地圖的封裝有些人用一個Manager作為地圖的管理類來管理地圖乙帮,我這里直接用了一個View杜漠,上面加載了一個地圖來處理的,都能實現(xiàn)蚣旱,不知道哪個方式好碑幅,大家可以自己去試試。
#import <UIKit/UIKit.h>
#import <MAMapKit/MAMapKit.h>
@class DDMapView;
@protocol DDMapViewDelegate <NSObject>
//滑動地圖先執(zhí)行1塞绿,再執(zhí)行2
@optional
/**
1沟涨、地圖區(qū)域改變完成后會調用此接口(多次調用)
@param ddMapView self
@param animated 是否動畫
*/
- (void)ddMapView:(DDMapView *)ddMapView regionDidChangeAnimated:(BOOL)animated;
/**
2、地圖移動結束調用此接口(多次調用)
@param ddMapView self
@param wasUserAction 是否用戶操作的滑動行為
*/
- (void)ddMapView:(DDMapView *)ddMapView mapDidMoveByUser:(BOOL)wasUserAction;
@end
@interface DDMapView : UIView
{
CLLocationCoordinate2D _centerCoordinate;//當前地圖的中心點經(jīng)緯度
}
@property (nonatomic, weak) id <DDMapViewDelegate> delegate;
//高德地圖
@property (nonatomic, strong) MAMapView *mapView;
//用戶當前位置
@property (nonatomic) CLLocationCoordinate2D userCoordinate;
- (instancetype)initWithFrame:(CGRect)frame delegate:(id<DDMapViewDelegate>)delegate;
/**
設置地圖中心點的坐標
@param centerCoordinate 經(jīng)緯度坐標
@param animated 是否有動畫
*/
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate animated:(BOOL)animated;
/**
獲取地圖中心點的坐標
@return 經(jīng)緯度坐標
*/
- (CLLocationCoordinate2D)centerCoordinate;
@end
這里特別說明一下為什么我將_centerCoordinate寫成一個實例變量异吻,又寫了他的set裹赴、get方法,用一個@property不就搞定了嗎诀浪,當然不是這樣的棋返,之所以這樣寫的原因是為了擴展它的set方法,添加一個參數(shù)animated雷猪,原來費這么大驚就為了這個啊睛竣,那還有其他什么的簡便方法嗎,知道的告訴我吧求摇,我們互相學習射沟。
DDMapView.m
實現(xiàn)文件里添加了一個地圖殊者,一個中間的圖片,中間圖片沒做什么動畫之類的验夯,項目需要的話可以自己做猖吴,我看好多地圖會做一個地圖一滑動,這個圖片跳動一下挥转,當然這個也是可以的海蔽,做個簡單的也還是可以的,然后下面再加個什么雷達效果什么的绑谣。
代碼在最后說明里面党窜,下載自己看看,歡迎提出意見域仇,別忘了用之前配置你的AppKey刑然。
最后說明
這只是一個小demo而已,根據(jù)自己項目的實際情況可以自己進行封裝更多功能暇务。我將這個小demo放在這里泼掠,如果有一起學習的可以交流https://github.com/Mexiang/AddressSearchController。