ViewController。h托控件視圖展示
@property (strong, nonatomic) IBOutlet UITextField *latitudeField;
@property (strong, nonatomic) IBOutlet UITextField *longitudeField;
@property (strong, nonatomic) IBOutlet MKMapView *mapView;
- (IBAction)goClicked:(id)sender;
ViewController匙隔。m 具體實(shí)現(xiàn)
#import#import "FKViewController.h"@interface FKViewController (){
//
CLGeocoder* geocoder;
}
@end
@implementation FKViewController
- (void)viewDidLoad
{
[super viewDidLoad];
geocoder = [[CLGeocoder alloc] init];
// 設(shè)置地圖的顯示風(fēng)格涉馅,此處設(shè)置使用標(biāo)準(zhǔn)地圖
self.mapView.mapType = MKMapTypeStandard;
// 設(shè)置地圖可縮放
self.mapView.zoomEnabled = YES;
// 設(shè)置地圖可滾動(dòng)
self.mapView.scrollEnabled = YES;
// 設(shè)置地圖可旋轉(zhuǎn)
self.mapView.rotateEnabled = YES;
// 設(shè)置顯示用戶當(dāng)前位置
self.mapView.showsUserLocation = YES;
// 調(diào)用自己實(shí)現(xiàn)的方法設(shè)置地圖的顯示位置和顯示區(qū)域
[self locateToLatitude:39.5427 longitude:116.2317];
// 創(chuàng)建一個(gè)手勢處理器般贼,用于檢測儒喊、處理長按手勢
UILongPressGestureRecognizer* gesture = [[UILongPressGestureRecognizer
alloc]initWithTarget:self action:@selector(longPress:)];
// 為該控件添加手勢處理器
[self.view addGestureRecognizer:gesture];
self.mapView.delegate = self;
}
- (IBAction)goClicked:(id)sender
{
// 關(guān)閉兩個(gè)文本框的虛擬鍵盤
[self.latitudeField resignFirstResponder];
[self.longitudeField resignFirstResponder];
NSString* latitudeStr = self.latitudeField.text;
NSString* longtitudeStr = self.longitudeField.text;
// 如果用戶輸入的經(jīng)度祠肥、緯度不為空
if (latitudeStr != nil && latitudeStr.length > 0
&& longtitudeStr != nil && longtitudeStr.length > 0)
{
// 調(diào)用自己實(shí)現(xiàn)的方法設(shè)置地圖的顯示位置和顯示區(qū)域
[self locateToLatitude:latitudeStr.floatValue
longitude:longtitudeStr.floatValue];
}
}
//自定義方法跳轉(zhuǎn)至指定經(jīng)緯度并添加錨點(diǎn)
- (void)locateToLatitude:(CGFloat)latitude longitude:(CGFloat)longitude
{
// 設(shè)置地圖中心的經(jīng)纸镊、緯度
CLLocationCoordinate2D center = {latitude , longitude};
// 設(shè)置地圖顯示的范圍鸵闪,
MKCoordinateSpan span;
// 地圖顯示范圍越小檐晕,細(xì)節(jié)越清楚
span.latitudeDelta = 0.01;
span.longitudeDelta = 0.01;
// 創(chuàng)建MKCoordinateRegion對(duì)象,該對(duì)象代表了地圖的顯示中心和顯示范圍蚌讼。
MKCoordinateRegion region = {center,span};
// 設(shè)置當(dāng)前地圖的顯示中心和顯示范圍
[self.mapView setRegion:region animated:YES];
// 創(chuàng)建MKPointAnnotation對(duì)象——代表一個(gè)錨點(diǎn)
MKPointAnnotation* annotation = [[MKPointAnnotation alloc] init];
annotation.title = @"八維研修學(xué)院";
annotation.subtitle = @"上地7街軟件園南";
CLLocationCoordinate2D coordinate = {latitude , longitude};
annotation.coordinate = coordinate;
// 添加錨點(diǎn)
[self.mapView addAnnotation:annotation];
}
- (void) longPress:(UILongPressGestureRecognizer*)gesture
{
// 獲取長按點(diǎn)的坐標(biāo)
CGPoint pos = [gesture locationInView:self.mapView];
// 將長按點(diǎn)的坐標(biāo)轉(zhuǎn)換為經(jīng)度辟灰、維度值
CLLocationCoordinate2D coord = [self.mapView convertPoint:pos
toCoordinateFromView:self.mapView];
// 將經(jīng)度、維度值包裝為CLLocation對(duì)象
CLLocation* location = [[CLLocation alloc] initWithLatitude:coord.latitude
longitude:coord.longitude];
// 根據(jù)經(jīng)篡石、緯度反向解析地址
[geocoder reverseGeocodeLocation:location completionHandler:
^(NSArray *placemarks, NSError *error)
{
if (placemarks.count > 0 && error == nil)
{
// 獲取解析得到的第一個(gè)地址信息
CLPlacemark* placemark = [placemarks objectAtIndex:0];
// 獲取地址信息中的FormattedAddressLines對(duì)應(yīng)的詳細(xì)地址
NSArray* addrArray = placemark
.addressDictionary[@"FormattedAddressLines"];
// 將詳細(xì)地址拼接成一個(gè)字符串
NSMutableString* address = [[NSMutableString alloc] init];
for(int i = 0 ; i < addrArray.count ; i ++)
{
[address appendString:addrArray[i]];
}
// 創(chuàng)建MKPointAnnotation對(duì)象——代表一個(gè)錨點(diǎn)
MKPointAnnotation? *annotation = [[MKPointAnnotation alloc] init];
annotation.title = placemark.name;
annotation.subtitle = address;
annotation.coordinate = coord;
// 添加錨點(diǎn)
[self.mapView addAnnotation:annotation];
}
}];
}
#if 1
// MKMapViewDelegate協(xié)議中的方法芥喇,該方法的返回值可用于定制錨點(diǎn)控件的外觀
- (MKAnnotationView *) mapView:(MKMapView *)mapViewviewForAnnotation:(id) annotation
{
static NSString* annoId = @"fkAnno";
// 獲取可重用的錨點(diǎn)控件
MKAnnotationView* annoView = [mapView
dequeueReusableAnnotationViewWithIdentifier:annoId];
// 如果可重用的錨點(diǎn)控件不存在,創(chuàng)建新的可重用錨點(diǎn)控件
if (!annoView)
{
annoView= [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annoId];
/*
如果不想改變錨點(diǎn)控件的圖片凰萨,只想改變顏色继控,則可創(chuàng)建MKPinAnnotationView實(shí)例
再修改MKPinAnnotationView對(duì)象的pinColor屬性即可。
*/
}
// 為錨點(diǎn)控件設(shè)置圖片
annoView.image = [UIImage imageNamed:@"pos.gif"];
// 設(shè)置該錨點(diǎn)控件是否可顯示氣泡信息
annoView.canShowCallout = YES;
// 定義一個(gè)按鈕胖眷,用于為錨點(diǎn)控件設(shè)置附加控件
UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
// 為按鈕綁定事件處理方法
[button addTarget:self action:@selector(buttonTapped:)
forControlEvents:UIControlEventTouchUpInside];
// 可通過錨點(diǎn)控件的rightCalloutAccessoryView武通、leftCalloutAccessoryView設(shè)置附加控件
annoView.rightCalloutAccessoryView = button;
return annoView;
}
#endif
- (void) buttonTapped:(id)sender
{
NSLog(@"您點(diǎn)擊了錨點(diǎn)信息!");
}
@end