Tengo un MKMapView
que está teniendo un problema muy extraño que es difícil de explicar. Tengo una MKOverlay
que se guarda entre sesiones guardando los puntos de la superposition en un file y cargando la superposition en viewDidLoad
. Entonces, aquí está el problema:
Pasos
MKOverlay
al MKMapView
MKOverlay
al map, todo en el map se superpone con una superposition del mismo color que la que agregué. Todo en el map con la exception de la vista del map que puede ver cuando se carga la vista. Otras cosas extrañas:
mapView.showsUserLocation
se establece en true iOS5
. Todo funciona bien en iOS6
. Este tipo está teniendo el mismo problema, aunque su solución no funcionó para mí.
Problemas con la superposition utilizando MKPolyline y MKPolylineView
Aquí hay algunos de mis códigos:
-(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; }
El código se llama cuando la vista se carga, he registrado las coorderadas que se agregan a la matriz de polilíneas justo antes de que se agreguen, ¡y todo está bien y genial!
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];
Aquí hay una image de lo que sucede cuando aparece la superposition y el usuario se inclina hacia un lado en el map: ¿Alguna idea sobre cuál es el problema?
Estás utilizando dequeueReusableAnnotationViewWithIdentifier, pero solo estás asignando una anotación a pinView si el resultado de dequeueReusableAnnotationViewWithIdentifier fue nulo.
Como ese método a menudo devolverá una instancia existente de MKPinAnnotationView, esto debería ser:
MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; if (pin == nil) { pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; } else { pin.annotation = annotation; }
Este podría ser el problema: cuando la vista de map intenta acceder a la vista para la location actual del usuario, está pasando su vista personalizada.
Intente agregar esto con su implementación existente.
- (MKAnnotationView *) mapView:(MKMapView *) mapView viewForAnnotation:(id ) annotation { if ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } return yourView; }
PD: Esto puede no ser un problema de vista de superposition.
Atentamente.