2013-02-21 11 views
5

Ho un MKMapView che sta avendo un problema molto strano che è un po 'difficile da spiegare. Ho un MKOverlay che viene salvato tra le sessioni salvando i punti della sovrapposizione su un file e caricando la sovrapposizione in viewDidLoad. Quindi, ecco il problema:MKOverlay sovrascrive tutto con circostanze strane solo su ios5?

Passi

  1. aggiungo un MKOverlay al MKMapView
  2. Al secondo o terzo periodo dopo l'aggiunta del MKOverlay per il tutto mappa sulla mappa viene sovrapposto da una sovrapposizione di lo stesso colore come quello che ho aggiunto. Tutto sulla mappa con l'eccezione della vista della mappa che è possibile visualizzare quando la vista è stata caricata.

Altre cose strane:

  1. Questo problema si verifica solo quando mapView.showsUserLocation è impostato su vero
  2. Questo problema si verifica solo su iOS5. Tutto funziona perfettamente su iOS6.
  3. Se si rimpicciolisce la sovrapposizione colorata, ridimensiona la porzione visibile di della mappa per riempire la mappa al nuovo livello a cui è stato eseguito lo zoom indietro.

Questo ragazzo ha lo stesso problema, anche se la sua soluzione non ha funzionato per me.

Trouble with overlay using MKPolyline & MKPolylineView

Ecco alcuni del mio codice:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 

    MKPinAnnotationView *pinView = nil; //switch this to MKAnnotationView and use .image property if pins need to be images 

    if(annotation == self.startingPin || annotation == self.endingPin){ 

     static NSString *defaultPinID = @"com.MagnusDevelopment.pin"; 

     pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 

     if (pinView == nil)pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 

     pinView.canShowCallout = YES; 
     pinView.animatesDrop = TRUE; 

     if(annotation == self.startingPin){ 
     //starting pin 
      pinView.pinColor = MKPinAnnotationColorGreen; 
     }else{ 
     //ending pin 
      pinView.pinColor = MKPinAnnotationColorRed; 
     } 

    } 
    return pinView; 
} 

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    MKPolylineView *aView = [[MKPolylineView alloc] initWithPolyline:(MKPolyline *)overlay]; 
    aView.lineWidth = 7.0; 
    aView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.6]; 
    return aView; 
} 

codice chiamato quando i carichi vista, mi hanno annotato le coordinate che vengono aggiunti alla matrice polilinea destra prima di essere aggiunti, e tutto va bene e dandy!

NSInteger numberOfSteps = pointsArray.count; 

    NSLog(@"number of steps: %i",numberOfSteps); 

    CLLocationCoordinate2D coordinates[numberOfSteps]; 
    for (NSInteger index = 0; index < numberOfSteps; index++) { 
     CLLocation *location = [pointsArray objectAtIndex:index]; 
     CLLocationCoordinate2D coordinate = location.coordinate; 
     coordinates[index] = coordinate; 
    } 
    MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfSteps]; 
    [self.mainMap addOverlay:polyLine]; 

ecco una foto di ciò che accade quando viene visualizzata la sovrapposizione e l'utente pentole a lato sulla mappa: qualche idea su qual è il problema?

risposta

1

Si sta utilizzando dequeueReusableAnnotationViewWithIdentifier, ma si sta assegnando un'annotazione a pinView se il risultato di dequeueReusableAnnotationViewWithIdentifier era nullo.

Poiché tale metodo spesso restituire un'istanza MKPinAnnotationView esistente, questo dovrebbe essere invece:

MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
if (pin == nil) { 
    pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 
} else { 
    pin.annotation = annotation; 
} 
+0

Il problema si verifica ancora ... – Shredder2794

+0

Hm, quando si creano la mappa e le linee? Poiché hai detto che accade solo quando la posizione dell'utente è attiva, prova a creare la mappa e le polilinee durante viewWillAppear della vista contenitore della mappa, quindi imposta showSserLocation della mappa su YES durante viewDidAppear. – poetmountain

+0

Questo funziona! Grazie mille! Dovresti modificare la tua risposta per adattarla alla risposta che mi hai dato in questi commenti per le persone future con questo problema! – Shredder2794

0

questo potrebbe essere il problema: Quando il mapview tenta di accedere alla visualizzazione per la posizione corrente dell'utente, si sta passando il tuo vista personalizzata.

Prova ad aggiungere questo con l'implementazione esistente.

- (MKAnnotationView *) mapView:(MKMapView *) mapView viewForAnnotation:(id) annotation 
{ 

if ([annotation isKindOfClass:[MKUserLocation class]]) { 
    return nil;  
} 
return yourView; 
} 

PS: questo potrebbe non essere un problema di visualizzazione sovrapposizione.

I migliori saluti.

+0

Il problema si verifica ancora ... – Shredder2794

Problemi correlati