我想允许我的应用的用户在地图中选择一个位置。原生地图有一个“drop pin”功能,您可以通过放置引脚来定位。我怎么能在MapKit中做到这一点?
答案 0 :(得分:27)
您需要创建一个实现 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 Reference Library中有关处理注释触摸事件的信息。
您还可以使用mapkit查看有关拖放的this article,其中涉及GitHub上的工作样本库。您可以通过检查 DDAnnotation 对象上的 _coordinates 成员来获取拖动注释的坐标。
答案 1 :(得分:23)
有多种方法可以放置引脚,而您没有在问题中指定哪种方式。第一种方法是以编程方式执行,因为您可以使用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);
}
答案 2 :(得分:8)
你可以通过点击jcesarmobile来获取coordinates with 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];
答案 3 :(得分:3)
您可能还需要设置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;
}