2012-04-13 8 views
5

Desidero aggiungere un numero di annotazioni (intorno a 500) su una mappa ma il massimo che sembra essere visualizzato è 100. Se vado oltre 100, il metodo delegato viewForAnnotation non viene chiamato. Tuttavia funziona perfettamente per annotazioni indicati 100.Numero massimo di annotazioni (MKAnnotation) che è possibile tracciare su MKMapView?

ecco il codice: (funziona solo quando il contatore di annotationArray matrice è inferiore a 101)

_allPoints = [[NSMutableArray alloc] init]; 

NSString* responseFile = [[NSBundle mainBundle] pathForResource:@"Datafile" ofType:@"txt"]; 
NSData *sampleData = [NSData dataWithContentsOfFile:responseFile]; 
if (sampleData) { 
    NSError* error; 
    NSDictionary* json = [NSJSONSerialization 
          JSONObjectWithData:sampleData 

          options:kNilOptions 
          error:&error]; 

    NSArray* response = [json objectForKey:@"response"]; 
    for (NSDictionary *lineDict in response) { 
     if ([[lineDict objectForKey:@"data"] isKindOfClass:[NSArray class]]) { 
      SinglePoint *singlePoint = [[SinglePoint alloc] initWithDictionary:lineDict]; 
      [_allPoints addObject:singlePoint]; 
     } 
     else { 
      NSLog(@"Error"); 
     } 
    } 
} 


_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
[_mapView setDelegate:self]; 
[self.view addSubview:_mapView]; 

NSMutableArray *annotationArray = [[NSMutableArray alloc] init]; 
for (int i=0; i<[_allPoints count]; i++) { 
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i]; 
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView]; 
    [annotationArray addObject:annotation]; 
} 
[_mapView addAnnotations:(NSArray *)annotationArray]; 

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 }; 
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO]; 

Il metodo delegato è:

EDIT: Come per i commenti, ha iniziato riutilizzando la vista, ma senza fortuna :(

if ([annotation isKindOfClass:[NVPolylineAnnotation class]]) { 
    static NSString *viewIdentifier = @"annotationView"; 
    NVPolylineAnnotationView *annotationView = (NVPolylineAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier]; 
    if (annotationView == nil) { 
     annotationView = [[NVPolylineAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewIdentifier mapView:_mapView]; 
    } 
    return annotationView; 
} 
return nil; 

Non sono riuscito a trovare alcuna restrizione nella documentazione o altrove. Potrebbe essere un problema di memoria?

+1

Cosa succede se si aggiunge il primo oggetto in 'allPoints' 500 volte al' annotationArray'? –

+0

E 'possibile fornire il codice sorgente per 'NVPolylineAnnotation'? –

risposta

0

Finalmente è stato in grado di rintracciare il problema. Risolto impostando prima il centro di mapView e aggiungendo successivamente le annotazioni. Ancora non so perché 100 annotazioni sono state mostrate prima (e perché solo il 100). Grazie a tutti per i vostri suggerimenti e il tempo su questo.

Questo è il codice che ho cambiato: -

_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
[_mapView setDelegate:self]; 
[self.view addSubview:_mapView]; 

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 }; 
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO]; 

NSMutableArray *annotationArray = [[NSMutableArray alloc] init]; 
for (int i=0; i<[_allPoints count]; i++) { 
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i]; 
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView]; 
    [annotationArray addObject:annotation]; 
} 
[_mapView addAnnotations:(NSArray *)annotationArray]; 
+0

Sarebbe possibile evitare la latitudine e la longitudine hardcoded costruendo un 'MKCoordinateRegion' che limita tutti i punti di annotazione, e quindi usa [setRegion: animated:] (http://developer.apple.com/library/ios/# documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html # // apple_ref/occ/instm/MKMapView/setRegion: animato :) per posizionare la mappa in qualsiasi posizione e zoom ha bisogno? (Avere un fallback se non ci sono punti, o si innescherà un'eccezione.) – Dondragmer

+0

Grazie per mettere la risposta .. –

1

MKMapView non ha limite per annotationViews. Ma diventa piuttosto lento e inutilizzabile al di sopra di un certo numero di visualizzazioni (+1000).

Credo che la ragione di ciò sia che si gestisce la gestione dello annotationView in modo completamente errato. Non si dovrebbe creare una visualizzazione univoca per ogni singola annotazione, anche se si sta utilizzando ARC. Il tuo piuttosto dovrebbe riutilizzare ogni vista inutilizzata come la cella di un UITableView.

Ci sono un paio di buoni tutorial per questo come Introduction to MapKit on iOS - Ray Wenderlich.

Se ciò non risolve il problema, provare a eseguire il debug delle classi di annotazione. (NVPolylineAnnotation e NVPolylineAnnotationView). Forse c'è qualcosa di sbagliato. Hai anche controllato la tua matrice di punti per coordinate uguali?

+1

Grazie @yinkou .. 1) Non penso che il problema riguardi la gestione della memoria perché accade esattamente quando ci sono 101 visualizzazioni. 2) Ho controllato i punti per le coordinate uguali ma non ce ne sono. Anche se alcuni punti sono uguali, dovrebbe disegnare i restanti 100 punti che sono in grado di vedere – Shri

+0

Hai ragione, tuttavia dovresti riutilizzare le annotationViews poiché questo è il modello raccomandato. Puoi pubblicare il codice dove crei e popola il tuo array _allPoints? – yinkou

+1

Ho aggiornato la domanda .. – Shri

0

È possibile aggiungere tutte le annotazioni desiderate. Tuttavia, le viste per ogni annotazione non verranno create finché la proprietà coordinate dell'annotazione non si interseca con la porzione visibile della visualizzazione mappa. MapKit non creerà una vista solo perché hai aggiunto un'annotazione alla mappa.

+0

In questo caso, non si disegna solo quando il numero di visualizzazioni supera 100. Se fornisco 101 viste, le prime 100 viste sono ancora le viste precedenti che venivano mostrate e nella parte visibile. Ma non appena viene visualizzato 101 visualizzazioni, non viene mostrato nulla. Anche il delegato non viene chiamato. – Shri

Problemi correlati