Пинк MKAnnotationView не появится - PullRequest
0 голосов
/ 11 августа 2011

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

    - (void)viewDidLoad{
    [super viewDidLoad];

    self.title = @"Location";
    mapView.showsUserLocation = YES;
    self.locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];
    [locationManager startUpdatingHeading];
}

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    NSLog(@"Annotation view run");
    MKPinAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];
    pin.animatesDrop = YES;
    return pin;
}

-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

// once location is determined, center to that location.
location = newLocation.coordinate;
MKCoordinateRegion region;
region.center = location;

MKCoordinateSpan span;
span.latitudeDelta = 0.003;
span.longitudeDelta = 0.003;
region.span = span;

[mapView setRegion:region animated:FALSE];

}

Любой совет о том, где я поступил неправильно, будет отличным!

1 Ответ

1 голос
/ 11 августа 2011

Поскольку ваш метод никогда не вызывается, вы должны сделать:

- (void)mapView:(MKMapView *)aMapView regionDidChangeAnimated:(BOOL)animated {
    [aMapView removeAnnotation:[self point]];
    mkShape.coordinate = aMapView.centerCoordinate;
    [aMapView addAnnotation:mkShape];
}

И вы должны правильно создать свой MKAnnotationView.Сначала вам нужно создать два свойства в файле .h (из соображений производительности):

MKPointAnnotation *mkShape;
MKAnnotationView *annotationView;

, а затем использовать приведенный ниже код для создания вашей MKPointAnnotation

- (void)createShape
{
    if (!mkShape) {
        mkShape = [[MKPointAnnotation alloc] init];
        mkShape.title = nil;
        mkShape.subtitle = @"test description";
    }
}

- (id <MKAnnotation>)point
{
    [self createShape];

    // Make sure to check if this is an MKPointAnnotation.  MKOverlays also
    // conform to MKAnnotation, so it isn't sufficient to just check to
    // conformance to MKAnnotation.
    if ([mkShape isKindOfClass:[MKPointAnnotation class]])
        return (id <MKAnnotation>)mkShape;

    return nil;
}

- (MKAnnotationView *)annotationView
{
    if (!annotationView) {
        id <MKAnnotation> annotation = [self point];
        if (annotation) {
            MKPinAnnotationView *pin =
            [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
            pin.canShowCallout = YES;
            pin.animatesDrop = YES;
            pin.draggable = NO;
            annotationView = pin;
        }
    }
    return annotationView;
}


- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isEqual:mkShape]) {
        return [self annotationView];
    }
    return nil;
}

забудьте освободить ваши свойства.

- (void)dealloc
{
    [annotationView release];
    [mkShape release];

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