我想允许我的应用程序的用户在地图中选择一个位置。原生地图具有“放置图钉”功能,您可以通过放置图钉来定位某物。如何在 MapKit 中做到这一点?
4 回答
您需要创建一个实现MKAnnotation协议的对象,然后将该对象添加到MKMapView:
@interface AnnotationDelegate : NSObject <MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString * title;
NSString * subtitle;
}
实例化您的委托对象并将其添加到地图中:
AnnotationDelegate * annotationDelegate = [[[AnnotationDelegate alloc] initWithCoordinate:coordinate andTitle:title andSubtitle:subt] autorelease];
[self._mapView addAnnotation:annotationDelegate];
地图将访问 AnnotationDelegate 上的坐标属性,以找出在地图上放置图钉的位置。
如果要自定义注释视图,则需要在 Map View Controller 上实现MKMapViewDelegate viewForAnnotation方法:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
如果您想实现引脚拖动功能,您可以在Apple OS 参考库中阅读有关处理注释触摸事件的信息。
您还可以查看这篇关于使用 mapkit 拖放的文章,它指的是GitHub 上的一个工作示例库。您可以通过检查DDAnnotation对象上的_coordinates成员来获取被拖动注释的坐标。
有多种方法可以放置图钉,并且您没有在问题中指定使用哪种方法。第一种方法是以编程方式进行,因为您可以使用 RedBlueThing 编写的内容,但您实际上并不需要自定义类(取决于您所针对的 iOS 版本)。对于 iOS 4.0 及更高版本,您可以使用此代码段以编程方式放置图钉:
// Create your coordinate
CLLocationCoordinate2D myCoordinate = {2, 2};
//Create your annotation
MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
// Set your annotation to point at your coordinate
point.coordinate = myCoordinate;
//If you want to clear other pins/annotations this is how to do it
for (id annotation in self.mapView.annotations) {
[self.mapView removeAnnotation:annotation];
}
//Drop pin on map
[self.mapView addAnnotation:point];
如果您希望能够通过例如长按实际的 mapView 来放置图钉,可以这样做:
// Create a gesture recognizer for long presses (for example in viewDidLoad)
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 0.5; //user needs to press for half a second.
[self.mapView addGestureRecognizer:lpgr]
- (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
return;
}
CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView];
CLLocationCoordinate2D touchMapCoordinate = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];
MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
point.coordinate = touchMapCoordinate;
for (id annotation in self.mapView.annotations) {
[self.mapView removeAnnotation:annotation];
}
[self.mapView addAnnotation:point];
}
如果要枚举所有注释,只需使用两个片段中的代码即可。这是您记录所有注释位置的方式:
for (id annotation in self.mapView.annotations) {
NSLog(@"lon: %f, lat %f", ((MKPointAnnotation*)annotation).coordinate.longitude,((MKPointAnnotation*)annotation).coordinate.latitude);
}
您可以通过jcesarmobile回答使用 iphone mapkit 获取点击坐标来获取位置,并且您可以在任何地方放置别针,如下所示
// Define pin location
CLLocationCoordinate2D pinlocation;
pinlocation.latitude = 51.3883454 ;//set latitude of selected coordinate ;
pinlocation.longitude = 1.4368011 ;//set longitude of selected coordinate;
// Create Annotation point
MKPointAnnotation *Pin = [[MKPointAnnotation alloc]init];
Pin.coordinate = pinlocation;
Pin.title = @"Annotation Title";
Pin.subtitle = @"Annotation Subtitle";
// add annotation to mapview
[mapView addAnnotation:Pin];
您可能还需要设置 MapView Delegate。
[mkMapView setDelegate:self];
然后调用它的代表,viewForAnnotation
:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
MKPinAnnotationView *pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"current"];
pinAnnotationView.animatesDrop = YES;
pinAnnotationView.pinColor = MKPinAnnotationColorRed;
return pinAnnotationView;
}