2013-02-21 14 views
5

Mam MKMapView, który ma bardzo dziwny problem, który jest trudny do wyjaśnienia. Mam zapisaną między sesjami MKOverlay, zapisując punkty nakładki w pliku i ładując nakładkę w postaci viewDidLoad. Więc tu jest problem:MKOverlay nakłada wszystko w dziwnych okolicznościach tylko na ios5?

Kroki

  1. dodam MKOverlay do MKMapView
  2. na drugim lub trzecim biegu po dodaniu MKOverlay do mapy wszystko na mapie zostaje nałożony przez nakładki ten sam kolor jako ten, który dodałem. Wszystko na mapie, z wyjątkiem widoku mapy, który można zobaczyć po załadowaniu widoku.

Inne dziwne rzeczy:

  1. Ten problem występuje tylko wtedy, gdy jest ustawiony na mapView.showsUserLocation prawdziwej
  2. Ten problem występuje tylko na iOS5. Wszystko działa poprawnie na iOS6.
  3. Jeśli pomniejszysz kolorową nakładkę, ponownie zmienisz widoczną część mapy, aby wypełnić mapę na nowym poziomie, na który pomniejszałeś.

Ten facet ma ten sam problem, chociaż jego rozwiązanie nie działa dla mnie.

Trouble with overlay using MKPolyline & MKPolylineView

Oto niektóre z moich kodu:

-(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; 
} 

Kod nazywany gdy widok ładunki, mam rejestrowane współrzędne, które są dodawane do tablicy polilinii tuż przed dodaniem ich i wszystko jest w porządku i 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]; 

Oto obraz tego, co dzieje się, gdy pojawi się nakładka i patelnie użytkownika do siebie na mapie: Wszelkie pomysły o czym jest problem?

Odpowiedz

1

Używasz dequeueReusableAnnotationViewWithIdentifier, ale przypisujesz tylko adnotację pinView, jeśli wynik dequeueReusableAnnotationViewWithIdentifier był zerowy.

W tej metodzie często zwracają istniejącej instancji MKPinAnnotationView, powinno to zamiast być:

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

Problem nadal występuje ... – Shredder2794

+0

Hm, kiedy tworzysz mapę i linie? Ponieważ powiedziałeś, że dzieje się to tylko wtedy, gdy lokalizacja użytkownika jest włączona, spróbuj zbudować mapę i polilinie podczas viewWillAppear widoku kontenera mapy, a następnie ustaw lokalizacjęUserLocation mapy na YES podczas viewDidAppear. – poetmountain

+0

To działa! Dziękuję bardzo! Powinieneś edytować swoją odpowiedź, aby pasowała do odpowiedzi, którą mi dałeś w tych komentarzach dla przyszłych ludzi z tym problemem! – Shredder2794

0

To może być problem: Gdy MapView próbuje uzyskać dostęp do widoku dla bieżącej lokalizacji użytkownika, jesteś przekazywaniu dostosowany widok.

Spróbuj dodać to do istniejącej implementacji.

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

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

PS: To może nie być problem z widokiem nakładki.

Pozdrawiam.

+0

Problem nadal występuje ... – Shredder2794

Powiązane problemy