十年专注于品牌网站建设 十年专注于品牌网站建设,低调、高逼格、有情怀的网络应用服务商!
南昌百恒网络微信公众号 扫一扫关注
小程序
tel-icon全国服务热线:400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号
扫一扫打开百恒网络微信小程序

百恒网络

南昌百恒网络

使用IOS苹果地图添加标注之触发添加动作

百恒网络 2017-09-18 292

如果要实现在地图视图上添加标注点,需要两个步骤才能实现,第一步是触发添加动作,第二步是实现地图委托方法 mapView:viewForAnnotation:。今天南昌APP制作开发公司-百恒网络小编先为大家介绍第一步:使用IOS苹果地图添加标注之触发添加动作,具体操作如下:

我们通过“查询”按钮触发添加标注动作,相关代码如下:

@IBAction func geocodeQuery(sender: AnyObject) {

if (self.txtQueryKey.text == nil) {

return

}

var geocoder = CLGeocoder()

geocoder.geocodeAddressString(self.txtQueryKey.text,

completionHandler: { (placemarks, error) -> Void in

if placemarks.count > 0 {

self.mapView.removeAnnotations(self.mapView.annotations) ①

}

for item in placemarks {

NSLog("查询记录数:%i", placemarks.count)

let placemark = item as CLPlacemark

//调整地图位置和缩放比例

let viewRegion = MKCoordinateRegionMakeWithDistance(

placemark.location.coordinate, 10000, 10000) ②

self.mapView.setRegion(viewRegion, animated: true) ③

let annotation = MyAnnotation(coordinate: placemark.location.coordinate) ④

annotation.city = placemark.locality

annotation.state = placemark.administrativeArea

annotation.streetAddress = placemark.thoroughfare

annotation.zip = placemark.postalCode ⑤

self.mapView.addAnnotation(annotation) ⑥

}

//关闭键盘

self.txtQueryKey.resignFirstResponder()

})

}

- (IBAction)geocodeQuery:(id)sender {

if (_txtQueryKey.text == nil || [_txtQueryKey.text length] == 0) {

return;

}

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

[geocoder geocodeAddressString:_txtQueryKey.text

completionHandler:^(NSArray *placemarks, NSError *error) {

NSLog(@"查询记录数:%lu",[placemarks count]);

if ([placemarks count] > 0) {

[self.mapView removeAnnotations:self.mapView.annotations]; ①

}

for (int i = 0; i < [placemarks count]; i++) {

CLPlacemark* placemark = placemarks[i];

//调整地图位置和缩放比例

MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(

placemark.location.coordinate, 10000, 10000); ②

[self.mapView setRegion:viewRegion animated:YES]; ③

MyAnnotation *annotation = [[MyAnnotation alloc] init]; ④

annotation.streetAddress = placemark.thoroughfare;

annotation.city = placemark.locality;

annotation.state = placemark.administrativeArea;

annotation.zip = placemark.postalCode;

annotation.coordinate = placemark.location.coordinate; ⑤

[self.mapView addAnnotation:annotation]; ⑥

}

//关闭键盘

[_txtQueryKey resignFirstResponder];

}];

}

当用户点击“查询”按钮时,开始进行地理信息编码,如果编码成功,则调用completionHandler方法。第①行代码用于移除目前地图上所有的标注点,否则反复点击“查询”按钮,你会发现地图上的标注点越来越多。

第②行代码使用MKCoordinateRegionMakeWithDistance函数创建一个结构体MKCoordinateRegion,该结构体封装了一个地图区域,其定义如下:

struct MKCoordinateRegion {

var center: CLLocationCoordinate2D //中心点

var span: MKCoordinateSpan //跨度

}

typedef struct {

CLLocationCoordinate2D center; //中心点

MKCoordinateSpan span; //跨度

} MKCoordinateRegion;

在上述代码中,成员center定义了区域中心点,它是CLLocationCoordinate2D结构体类型。span成员定义了区域的跨度,它是MKCoordinateSpan结构体类型。MKCoordinateSpan结构体封装了在地图上的跨度信息,它的定 义如下:

struct MKCoordinateSpan {

var latitudeDelta: CLLocationDegrees //区域的南北跨度

var longitudeDelta: CLLocationDegrees //区域的东西跨度

}

typedef struct {

CLLocationDegrees latitudeDelta; //区域的南北跨度

CLLocationDegrees longitudeDelta; //区域的东西跨度

} MKCoordinateSpan;

在上述代码中,latitudeDelta为南北跨度,它的单位是“度”,1度大约是111公里。longitudeDelta为东西 跨度,在赤道上1度大约是111公里,随着靠近两极,这个距离逐步变小,在地球的两个极点时变为0公里。它们 是有差别的,这源于我们地球经线和纬线的中心点不同。

在第②行代码中,MKCoordinateRegionMakeWithDistance函数的第一个参数是CLLocationCoordinate2D结构, 指定了目标区域的中心点;第二个参数是目标区域南北的跨度,其单位是米;第三个参数是目标区域东西的跨度,其单位是米。后面两个参数的调整会影响地图缩放。

第③行代码重新设置地图视图的显示区域。animated设置为true(或YES)时,会使地图有“飞”过去的动 画效果。

第④行代码用于实例化MyAnnotation对象。MyAnnotation类是我们自定义的实现MKAnnotation协议的地图标注 点类。因为地图上的标注点是MKPinAnnotationView(大头针标注视图)类型,这个视图要求标注点信息由实现 MKAnnotation协议的类提供。如果标识点上显示的信息是固定的,可以使用Map Kit API实现MKPointAnnotation 标注类。第④~⑤行代码将地标CLPlacemark对象信息取出,放入到MapLocation对象中。为什么要这样导来导去呢? 这是因为在MKPinAnnotationView视图中,只能接收实现MKAnnotation协议的类,而地标类CLPlacemark没有实现 MKAnnotation协议。

第⑥行代码把标注点MyAnnotation对象添加到地图视图上。一旦该方法被调用,地图视图委托方法mapView: viewForAnnotation:就会被回调。

以上就是百恒网络为大家介绍的关于在南昌APP开发中使用IOS苹果地图添加标注时触发添加动作的方法,大家可以先了解一下,后面本公司还会为大家介绍添加标注的第二步,那就是实现地图委托方法 mapView:viewForAnnotation:,希望对大家有所帮助!

400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号
扫一扫打开百恒网络小程序

欢迎您的光顾,我们将竭诚为您服务×

售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售前咨询 售前咨询
 
售后服务 售后服务
 
售后服务 售后服务
 
备案专线 备案专线
 
×