#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
導入協議<MKMapViewDelegate>
{
CLGeocoder* geocoder;
}
- (void)viewDidLoad
{
[super viewDidLoad];
geocoder = [[CLGeocoder alloc] init];
// 調用自己實現的方法設置地圖的顯示位置和顯示區域
[self locateToLatitude:39.5427 longitude:116.2317];
// 創建一個手勢處理器,用于檢測、處理長按手勢
UILongPressGestureRecognizer* gesture = [[UILongPressGestureRecognizer
alloc]initWithTarget:self action:@selector(longPress:)];
// 為該控件添加手勢處理器
[self.view addGestureRecognizer:gesture];
self.mapView.delegate = self;
}
- (IBAction)goClicked:(id)sender
{
// 關閉兩個文本框的虛擬鍵盤
[self.latitudeField resignFirstResponder];
[self.longitudeField resignFirstResponder];
NSString* latitudeStr = self.latitudeField.text;
NSString* longtitudeStr = self.longitudeField.text;
// 如果用戶輸入的經度、緯度不為空
if (latitudeStr != nil && latitudeStr.length > 0
&& longtitudeStr != nil && longtitudeStr.length > 0)
{
// 調用自己實現的方法設置地圖的顯示位置和顯示區域
[self locateToLatitude:latitudeStr.floatValue
longitude:longtitudeStr.floatValue];
}
}
//自定義
- (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 = @"上地7街軟件園南";
CLLocationCoordinate2D coordinate = {latitude , longitude};
annotation.coordinate = coordinate;
// 添加錨點
[self.mapView addAnnotation:annotation];
}
//手勢回調
- (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];
}
}];
}
#if 1
// 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:@"pos.gif"];
// 設置該錨點控件是否可顯示氣泡信息
annoView.canShowCallout = YES;
// 定義一個按鈕,用于為錨點控件設置附加控件
UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
// 為按鈕綁定事件處理方法
[button addTarget:self action:@selector(buttonTapped:)
forControlEvents:UIControlEventTouchUpInside];
// 可通過錨點控件的rightCalloutAccessoryView、leftCalloutAccessoryView設置附加控件
annoView.rightCalloutAccessoryView = button;
return annoView;
}
#endif
- (void) buttonTapped:(id)sender
{
NSLog(@"您點擊了錨點信息!");
}