Выберите местоположение на картах Google, сделав динамическую аннотацию в iPhone - PullRequest
4 голосов
/ 29 декабря 2011

Я хочу создать динамическую аннотацию булавки на карте Google в iPhone таким образом, чтобы пользователь мог перетащить булавку, прикоснувшись к ней, и поместить эту булавку на карты Google, чтобы указать местоположение по своему выбору.После того, как пользователь введет пин-код, я хочу получить координаты местоположения и название локации, соответствующее этому пин-коду.Любое предложение, как разработать это в iPhone.Спасибо

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

В вашем контроллере представления вы должны реализовать методы из протокола MKMapViewDelegate и LongPressGestureAware (который я создал) для удаления булавки на карте, когда пользователь нажимает и удерживает на экране.

В вашей аннотации должна быть реализована MKAnnotationи MKReverseGeocoderDelegate протоколы.

Я вставляю часть своего кода, который может вам помочь:

SimpleMapAnnotationViewController.h:

@interface SimpleMapAnnotationViewController : TTViewController<LongPressGestureAware, MKMapViewDelegate> {
    SimpleMapAnnotation *_dropPin;
    MKPinAnnotationView *_pinView;
}

SimpleMapAnnotationViewController.m:

#pragma mark -
#pragma mark LongPressGestureAware

-(void) initLongPressGestureRecognizer {
    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)];
    [self.map addGestureRecognizer:longPressGesture];
    [longPressGesture release];
}

-(void)handleLongPressGesture:(UIGestureRecognizer*)sender {

    if([sender isMemberOfClass:[UILongPressGestureRecognizer class]] && (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateBegan)) {
    [self.map removeGestureRecognizer:sender]; //avoid multiple pins to appear when holding on the screen
    } 
    CGPoint point = [sender locationInView:self.map];
    CLLocationCoordinate2D theCoordinate = [self.map convertPoint:point toCoordinateFromView:self.map];
    self.dropPin = [[[SimpleMapAnnotation alloc] initWithCoordinate:theCoordinate] autorelease];
    [self.map addAnnotation:self.dropPin];
    [self performSelector:@selector(selectInitialAnnotation) withObject:nil afterDelay:0.5];
}

-(void)selectInitialAnnotation {
    [self.map selectAnnotation:[self.map.annotations objectAtIndex:0] animated:YES];
}

#pragma mark -
#pragma mark MKMapViewDelegate

- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation {
    if (annotation == self.map.userLocation){
        return nil; //default to blue dot
    }
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"annotation_ID"];
    if (pin == nil) {
        pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"annotation_ID"] autorelease];
    } else {
        pin.annotation = annotation;
    }

    pin.canShowCallout = YES;
    pin.draggable = YES;
    pin.animatesDrop = YES;
    pin.pinColor = MKPinAnnotationColorGreen;

    self.pinView = pin;
    self.dropPin.pinView = self.pinView;    
    return pin;
}


- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState {
//NSArray *annotations = self.map.annotations;
if (oldState == MKAnnotationViewDragStateDragging) {
    SimpleMapAnnotation *annotation = (SimpleMapAnnotation *)annotationView.annotation;
    [annotation updateSubtitle];    
}
if(newState == MKAnnotationViewDragStateEnding) {
    NSLog(@"drag finish");
}
}

SimpleMapAnnotation.h

@interface SimpleMapAnnotation : NSObject <MKAnnotation, MKReverseGeocoderDelegate> {
    CLLocationCoordinate2D _coordinate;
    NSString *_title;
    NSString *_subtitle;
    MKPinAnnotationView *_pinView; 
}

SimpleMapAnnotation.m

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate {  
    self.coordinate = coordinate;
    MKReverseGeocoder *geoCoder = [[MKReverseGeocoder alloc] initWithCoordinate:self.coordinate];
    geoCoder.delegate = self;
    [geoCoder start];
    self.subtitle = [NSString   stringWithFormat:@"%f %f", self.coordinate.latitude, self.coordinate.longitude]; 
return self;
}

#pragma mark -
#pragma mark MKReverseGeocoderDelegate

// this delegate is called when the reverseGeocoder finds a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
    MKPlacemark * myPlacemark = placemark;
    NSString *address = [myPlacemark.addressDictionary objectForKey:(NSString*) kABPersonAddressStreetKey];
    self.title = address;
}

// this delegate method is called if an error occurs in locating your current location
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{
    NSLog(@"locationManager:%@ didFailWithError:%@", manager, error);
}

// this delegate is called when the reversegeocoder fails to find a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
{
     //invalid place
}
1 голос
/ 29 декабря 2011

Вы можете прочитать документацию на Карты Annonations. Вот ссылка

Вы можете получить координаты местоположения из любой точки в MapView, используя convertPoint: toCoordinateFromView: метод MapView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...