地圖自定義錨點+覆蓋物

weixin_34365417發表於2017-08-31

匯入系統庫

6348855-6ed7d5fca3b485bd.png

通過拖控制元件的方式:


6348855-1e950490976df347.png

程式碼實現

匯入標頭檔案

#import< MapKit/MapKit.h>//地圖

#import <CoreLocation/CoreLocation.h>//定位

新增  <MKMapViewDelegate > 協議

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

@property (weak, nonatomic) IBOutlet UITextField *weiduTf;

@property (weak, nonatomic) IBOutlet UITextField *jingduTf;

//地理編碼

@property(strong,nonatomic)CLGeocoder *geocoder;

- (void)viewDidLoad {

[super viewDidLoad];

//初始化地理編碼

_geocoder= [[CLGeocoder alloc]init];

//設定地圖的顯示風格,此處設定使用標準地圖

self.mapView.mapType=MKMapTypeStandard;

//設定地圖可縮放

self.mapView.zoomEnabled=YES;

//設定地圖可滾動

self.mapView.scrollEnabled=YES;

//設定地圖可旋轉

self.mapView.rotateEnabled=YES;

//設定顯示使用者當前位置

self.mapView.showsUserLocation=YES;

//呼叫自己實現的方法設定地圖的顯示位置和顯示區域

[self locateToLatitude:37.23 longitude:122.1234];

//建立手勢物件  (覆蓋物手勢)

UITapGestureRecognizer *tap =[[UITapGestureRecognizer alloc]initWithTarget:self    action:@selector(tapAction:)];

//配置屬性

//輕拍次數

tap.numberOfTapsRequired =1;

//輕拍手指

tap.numberOfTouchesRequired =1;

//新增到檢視

[self.view addGestureRecognizer:tap];


// 建立一個手勢處理器,用於檢測、處理長按手勢(錨點手勢)

UILongPressGestureRecognizer* gesture = [[UILongPressGestureRecognizer       alloc]initWithTarget:self action:@selector(longPress:)];

//為該控制元件新增手勢處理器

[self.view addGestureRecognizer:gesture];

//遵守代理是要實現自定義錨點

self.mapView.delegate=self;

}


按鈕方法

- (IBAction)chazhao:(id)sender {

//緯度

NSString* latitudeStr =self.weiduTf.text;

//經度

NSString* longtitudeStr =self.jingduTf.text;

//如果使用者輸入的經度、緯度不為空

if(latitudeStr !=nil&& latitudeStr.length>0

&& longtitudeStr !=nil&& longtitudeStr.length>0)

{

//呼叫自己實現的方法設定地圖的顯示位置和顯示區域

[self locateToLatitude:latitudeStr.floatValue

longitude:longtitudeStr.floatValue];

}

}

手勢方法

#pragma mark --手勢回撥

- (void) longPress:(UILongPressGestureRecognizer*)gesture{

//獲取長按點的座標

CGPoint pos = [gesture locationInView:self.mapView];

//將長按點的座標轉換為經度、維度值

CLLocationCoordinate2D coord = [self.mapView convertPoint:pos toCoordinateFromView:self.mapView];

//將經度、維度值包裝為CLLocation物件

CLLocation* location = [[CLLocation alloc]initWithLatitude:coord.latitude

longitude:coord.longitude];

//根據經、緯度反向解析地址

[_geocoder reverseGeocodeLocation:location completionHandler:

^(NSArray*placemarks,NSError*error)

{

if(placemarks.count>0&& error ==nil)

{

//獲取解析得到的第一個地址資訊

CLPlacemark* placemark = [placemarks objectAtIndex:0];

//獲取地址資訊中的FormattedAddressLines對應的詳細地址

NSArray* addrArray = placemark

.addressDictionary[@"FormattedAddressLines"];

//將詳細地址拼接成一個字串

NSMutableString* address = [[NSMutableString alloc]init];

for(int i =0; i < addrArray.count; i ++)

{

[address appendString:addrArray[i]];

}

//建立MKPointAnnotation物件——代表一個錨點

MKPointAnnotation*annotation = [[MKPointAnnotation alloc]init];

annotation.title= placemark.name;

annotation.subtitle= address;

annotation.coordinate= coord;

//新增錨點

[self.mapView addAnnotation:annotation];

}

}];

}

# pragma    點按手勢回撥

//輕拍事件

-(void)tapAction:(UITapGestureRecognizer *)tap

{

// 獲取長按點的座標

CGPoint pos = [tap locationInView:self.mapView];

// 將長按點的座標轉換為經度、維度值

CLLocationCoordinate2D coord = [self.mapView convertPoint:pos

toCoordinateFromView:self.mapView];

// 建立MKCircle物件,該物件代表覆蓋層

MKCircle* circle = [MKCircle circleWithCenterCoordinate:coord radius:100];

// 新增MKOverlay

[self.mapView addOverlay:circle level:MKOverlayLevelAboveLabels];

}

自定義封裝定位方法

- (void)locateToLatitude:(CGFloat)latitude longitude:(CGFloat)longitude{

//設定地圖中心的經、緯度

CLLocationCoordinate2D center = {latitude , longitude};

//設定地圖顯示的範圍,

MKCoordinateSpan span;

//地圖顯示範圍越小,細節越清楚

span.latitudeDelta=0.01;

span.longitudeDelta=0.01;

//建立MKCoordinateRegion物件,該物件代表了地圖的顯示中心和顯示範圍。

MKCoordinateRegion region = {center,span};

//設定當前地圖的顯示中心和顯示範圍

[self.mapView setRegion:region animated:YES];

//建立MKPointAnnotation物件——代表一個錨點

MKPointAnnotation* annotation = [[MKPointAnnotation alloc]init];

annotation.title=@"北京石羿科技發展有限公司";

annotation.subtitle=@"海淀區中關村軟體園";

CLLocationCoordinate2D coordinate = {latitude , longitude};

annotation.coordinate= coordinate;

//新增錨點

[self.mapView addAnnotation:annotation];

}

#pragma mark -自定義錨點

// MKMapViewDelegate協議中的方法,該方法的返回值可用於定製錨點控制元件的外觀

- (MKAnnotationView*) mapView:(MKMapView*)mapView

viewForAnnotation:(id) annotation{

static NSString *annoId =@"fkAnno";

//獲取可重用的錨點控制元件

MKAnnotationView *annoView = [mapView

dequeueReusableAnnotationViewWithIdentifier:annoId];

//如果可重用的錨點控制元件不存在,建立新的可重用錨點控制元件

if(!annoView)

{

annoView= [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annoId];

/*

如果不想改變錨點控制元件的圖片,只想改變顏色,則可建立MKPinAnnotationView例項

再修改MKPinAnnotationView物件的pinColor屬性即可。

*/

}

//為錨點控制元件設定圖片

annoView.image= [UIImage imageNamed:@"1.png"];

//設定該錨點控制元件是否可顯示氣泡資訊

annoView.canShowCallout=YES;

//定義一個按鈕,用於為錨點控制元件設定附加控制元件

UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

//為按鈕繫結事件處理方法

[button addTarget:self action:@selector(buttonTapped:)

forControlEvents:UIControlEventTouchUpInside];

//可通過錨點控制元件的rightCalloutAccessoryView、leftCalloutAccessoryView設定附加控制元件

annoView.rightCalloutAccessoryView= button;

return annoView;

}

#pragma mark -自定義錨點--裡面的詳情按鈕

- (void) buttonTapped:(id)sender

{

NSLog(@"您點選了錨點資訊!");

}


// MKMapViewDelegate協議中的方法,該方法返回的MKOverlayRenderer負責繪製覆蓋層控制元件- (MKOverlayRenderer *)mapView:(MKMapView *)mapViewrendererForOverlay:(id)overlay

{

MKCircle * circle = (MKCircle*)overlay;

// 建立一個MKCircleRenderer物件

MKCircleRenderer* render = [[MKCircleRenderer alloc] initWithCircle:circle];

// 設定MKCircleRenderer的透明度

render.alpha = 0.5;

// 設定MKCircleRenderer的填充顏色和邊框顏色

render.fillColor = [UIColor blueColor];

render.strokeColor = [UIColor redColor];

return render;

}

最終效果

覆蓋物效果


6348855-ae9302743115d492.png


6348855-cf9f41e40248c2fa.gif

相關文章