¿Cómo llevar UIBezierPath al reverso de un object MKAnnotation?

En mi aplicación, el usuario dibuja una forma en el map y usando UIBeizerPath estoy dibujando esa ruta. Luego, según las coorderadas de la ruta, muestro los resultados que solo están en esa área. Todo funciona muy bien, excepto que ahora cuando las annotations caen en la vista de map, los pines parecen estar detrás del path, lo que significa que la ruta se ve en el frente.

Estoy usando este código para mostrar la Anotación y la ruta:

-(void)clearAnnotationAndPath:(id)sender { [_mapView removeAnnotations:_mapView.annotations]; path = [UIBezierPath bezierPath]; [shapeLayer removeFromSuperlayer]; } - (void)handleGesture:(UIPanGestureRecognizer *)gesture { CGPoint location = [gesture locationInView:_pathOverlay]; if (gesture.state == UIGestureRecognizerStateBegan) { shapeLayer = [[CAShapeLayer alloc] init]; shapeLayer.fillColor = [[UIColor clearColor] CGColor]; shapeLayer.strokeColor = [[UIColor greenColor] CGColor]; shapeLayer.lineWidth = 5.0; //[_mapView.layer addSublayer:shapeLayer]; [pathOverlay.layer addSublayer:shapeLayer]; path = [UIBezierPath bezierPath]; [path moveToPoint:location]; } else if (gesture.state == UIGestureRecognizerStateChanged) { [path addLineToPoint:location]; shapeLayer.path = [path CGPath]; } else if (gesture.state == UIGestureRecognizerStateEnded) { // MKMapView *mapView = (MKMapView *)gesture.view; [path addLineToPoint:location]; [path closePath]; allStations = [RoadmapData shanetworkingInstance].data; for (int i=0; i<[allStations count]; i++) { NSDictionary * itemNo = [allStations objectAtIndex:i]; NSString * fullAddress = [NSString stringWithFormat:@"%@,%@,%@,%@",[itemNo objectForKey:@"address"],[itemNo objectForKey:@"city"],[itemNo objectForKey:@"state"],[itemNo objectForKey:@"zip"]]; CLGeocoder * geoCoder = [[CLGeocoder alloc]init]; [geoCoder geocodeAddressString:fullAddress completionHandler:^(NSArray *placemarks, NSError *error) { if (error) { NSLog(@"Geocode failed with error: %@", error); return; } if(placemarks && placemarks.count > 0) { CLPlacemark *placemark = placemarks[0]; CLLocation *location = placemark.location; CLLocationCoordinate2D coords = location.coordinate; CGPoint loc = [_mapView convertCoordinate:coords toPointToView:_pathOverlay]; if ([path containsPoint:loc]) { NSString * name = [itemNo objectForKey:@"name"]; stationAnn = [[LocationAnnotation alloc]initWithCoordinate:coords Title:name subTitle:@"Wells Fargo Offer" annIndex:i]; stationAnn.tag = i; [_mapView addAnnotation:stationAnn]; } else{ NSLog(@"Out of boundary"); } } }]; [self turnOffGesture:gesture]; } } } - (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{ if (views.count > 0) { UIView* firstAnnotation = [views objectAtIndex:0]; UIView* parentView = [firstAnnotation superview]; if (_pathOverlay == nil){ // create a transparent view to add bezier paths to pathOverlay = [[UIView alloc] initWithFrame: parentView.frame]; pathOverlay.opaque = NO; pathOverlay.backgroundColor = [UIColor clearColor]; [parentView addSubview:pathOverlay]; } // make sure annotations stay above pathOverlay for (UIView* view in views) { [parentView bringSubviewToFront:view]; } } } 

Además, una vez que vuelvo de esto y veo y vuelve, ni siquiera dibuja el Camino.

Por favor ayuda.

Gracias,

Al parecer, cuando agrega su ruta bezier al map a través de:

  [_mapView.layer addSublayer:shapeLayer]; 

se está agregando por encima de alguna capa interna que MKMapView utiliza para dibujar las annotations. Si echa un vistazo a esta pregunta un tanto relacionada , verá que puede implementar el protocolo MKMapViewDelegate y get devoluciones de llamada cuando se agreguen nuevas annotations de estación. Cuando esto sucede, básicamente inspecciona la jerarquía de la vista de las annotations recién agregadas e inserta una nueva capa UIView transparente debajo de ellas. UIView cuidado de traer todas las annotations al frente de esta UIView transparente.

  // always remember to assign the delegate to get callbacks! _mapView.delegate = self; 

 #pragma mark - MKMapViewDelegate - (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{ if (views.count > 0) { UIView* firstAnnotation = [views objectAtIndex:0]; UIView* parentView = [firstAnnotation superview]; // NOTE: could perform this initialization in viewDidLoad, too if (self.pathOverlay == nil){ // create a transparent view to add bezier paths to pathOverlay = [[UIView alloc] initWithFrame: parentView.frame]; pathOverlay.opaque = NO; pathOverlay.backgroundColor = [UIColor clearColor]; [parentView addSubview:pathOverlay]; } // make sure annotations stay above pathOverlay for (UIView* view in views) { [parentView bringSubviewToFront:view]; } } } 

Entonces, en lugar de agregar tu capa de forma a _mapView.layer , lo agregas a tu capa de vista transparente, también usando esta nueva capa en la conversión de coorderadas:

 - (void)handleGesture:(UIPanGestureRecognizer*)gesture { CGPoint location = [gesture locationInView: self.pathOverlay]; if (gesture.state == UIGestureRecognizerStateBegan) { if (!shapeLayer) { shapeLayer = [[CAShapeLayer alloc] init]; shapeLayer.fillColor = [[UIColor clearColor] CGColor]; shapeLayer.strokeColor = [[UIColor greenColor] CGColor]; shapeLayer.lineWidth = 5.0; [pathOverlay.layer addSublayer:shapeLayer]; // <- change here !!! } self.path = [[UIBezierPath alloc] init]; [path moveToPoint:location]; } else if (gesture.state == UIGestureRecognizerStateChanged) { [path addLineToPoint:location]; shapeLayer.path = [path CGPath]; } else if (gesture.state == UIGestureRecognizerStateEnded) { /* * This code is the same as what you already have ... */ // But replace this next line with the following line ... //CGPoint loc = [_mapView convertCoordinate:coords toPointToView:self]; CGPoint loc = [_mapView convertCoordinate:coords toPointToView: self.pathOverlay]; /* * And again use the rest of your original code */ } } 

donde también agregué un ivar (y propiedad) para la nueva capa transparente:

 UIView* pathOverlay; 

Probé esto con una grilla de estaciones falsas y obtuve los siguientes resultados:

introduzca la descripción de la imagen aquí

PS También recomendaría deshacerse de sus variables static . Solo hágales ivars / properties de su class.