地圖自定義錨點+覆蓋物

導入系統庫

通過拖控件的方式:


代碼實現

導入頭文件

#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;

}

最終效果

覆蓋物效果



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容