地图注释的自定义标题
Posted
技术标签:
【中文标题】地图注释的自定义标题【英文标题】:Custom title for map annotation 【发布时间】:2013-09-08 23:33:24 【问题描述】:在我的地图应用程序中,用户可以在搜索栏中输入地址,该位置会以红色大头针显示。是否可以在我的代码中让用户在将图钉放置在地图上之前输入自定义标题和副标题?标题和副标题应显示在标注气泡中。这是怎么做的?现在,我所有的 pin 标题都是“我的地方”。
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
if (!self.geocoder)
self.geocoder = [[CLGeocoder alloc] init];
NSString *address = [NSString stringWithFormat:@"%@", self.searchBar.text];
[self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error)
if ([placemarks count] > 0)
CLPlacemark *placemark = [placemarks objectAtIndex:0];
CLLocation *location = placemark.location;
CLLocationCoordinate2D coordinate = location.coordinate;
NSLog (@"%f %f", coordinate.latitude, coordinate.longitude);
MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta = 0.01;
span.longitudeDelta = 0.01;
region.span = span;
region.center = coordinate;
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
[annotation setCoordinate:coordinate];
[annotation setTitle:@"My Place"];
[[self mapView] addAnnotation:annotation];
[self.mapView setRegion:region animated:TRUE];
[self.mapView regionThatFits:region];
[self.searchBar resignFirstResponder];
self.searchBar.text = @"";
];
另外,如何将我所有的 pin 保存到 NSUserDefault,以便在应用重新启动时显示出来?这会起作用吗,还是只会节省一个引脚?
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setDouble:coordinate.latitude forKey:allPins_latitude];
[defaults setDouble:coordinate.longitude forKey:allPins_longitude];
[defaults setBool:YES forKey:allPins_coordinates];
[defaults synchronize];
如果有任何帮助,我将不胜感激!谢谢!
【问题讨论】:
【参考方案1】:当然,您可以让您的用户输入标题。
您上面的代码创建了一个注释对象并将其标题设置为固定标题。
不要这样做,而是创建注释,将其保存到实例变量,并使用 UIAlertViewStylePlainTextInput 显示警报视图以收集注释名称。让自己成为alert view的delegate,然后在你的alertView:clickedButtonAtIndex:方法中,如果用户点击ok,从alert view中获取title,在annotation上设置title属性,并将annotation添加到map中
至于将注释保存为用户默认值:
我建议创建您自己的符合 MKAnnotation 对象的对象。它只需要一个坐标属性、一个标题属性和一个副标题属性。让你的注解对象符合 NSCoding 协议(实现 initWithCoder 和 encodeWithCoder。)
完成此操作后,您可以使用 NSKeyedArchiver 类方法 archivedDataWithRootObject 将整个注释对象数组转换为 NSData。然后只需将数据保存到用户默认值。启动时,读取 NSData 对象,使用 unarchiveObjectWithData: 将其转换回您的自定义注释对象数组,然后将注释添加回您的地图。
【讨论】:
谢谢,我真的很喜欢你的 UIAlertView 解决方案。我会尝试这样做。至于 MKAnnotation 对象,我不知道该怎么做。你愿意分享一些示例代码,或者告诉我在哪里可以找到教程吗?我将不胜感激!【参考方案2】:如果您想为每个点设置不同的标题和副标题,您需要提供一个文本框供用户输入数据。一旦完成,它就像你已经拥有的代码一样简单
NSString *title = [self.titleField stringValue];
[annotation setTitle:@"title"];
NSString *subtitle = [self.subtitleField stringValue];
[annotation setSubtitle:@"title"];
但是,您可能没有足够的屏幕空间来显示三个文本字段。 I do 是使用默认名称创建图钉,然后允许用户打开标注气泡,或自动打开并显示一个按钮来编辑它,然后在顶部显示一个模式对话框来编辑标题和副标题
如果您在 allPins_latitude
键下保存了每个 coordinate.latitude
,那么每个都会覆盖前一个,而您只会保存最后一个。如果您的引脚都存储为数组,请存储数组。
【讨论】:
谢谢!这很有帮助。我确实有一个问题......我只是盯着学习如何使用地图工具包。我的标注视图已经有一个按钮,但是如何使用这个按钮显示一个模式对话框?以及如何将我的引脚存储为数组? 顺便说一句,我点击了您提供的链接。您的应用看起来不错。 这两个问题都应该是 *** 上的一个新条目,它可以帮助其他有相同问题的人找到解决方案,但是您在标注中寻找的是mapView:annotationView:calloutAccessoryControlTapped:
当点击按钮时它将转到该功能,您可以做任何您想做的事情,包括显示模态对话框。数组的东西很简单。添加新引脚的所有内容,将其添加到数组中。试一试,然后在遇到困难时提出一个新问题。【参考方案3】:
@petter 我认为下面的代码会帮助你 //迅速 3
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
let Userlocation : CLLocation = locations[0]
let center = CLLocationCoordinate2D(latitude: Userlocation.coordinate.latitude
, longitude: Userlocation.coordinate.longitude)
let annotation = MKPointAnnotation()
annotation.coordinate = center
annotation.title = "title"
Annotation.subtitle = “Subtitle”
mapView.addAnnotation(annotation)
let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
mapView.setRegion(region, animated: true)
【讨论】:
以上是关于地图注释的自定义标题的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的自定义 MKAnnotation 未添加到地图的注释中