Nella mia app, l'utente disegna una forma sulla mappa e usando UIBeizerPath sto disegnando quel percorso. Quindi in base alle coordinate del percorso sto visualizzando i risultati che sono solo in quella zona. Tutto funziona alla grande eccetto che ora, quando le annotazioni cadono sulla mappa, i perni sembrano essere dietro il percorso, il che significa che il percorso appare nella parte anteriore.Come portare UIBezierPath sul retro di un oggetto MKAnnotation?
Sto usando questo codice per visualizzare l'annotazione e il percorso:
-(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 sharedInstance].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];
}
}
}
Anche una volta che torno da questo e di visualizzare e vengo di nuovo la sua non è nemmeno disegnare il percorso.
Per favore aiuto.
Grazie,
Ho fatto questo e ora non riesco nemmeno a vedere il livello disegnato sulla mappa. Sebbene controlli l'annotazione corretta e li visualizzi. – Ashutosh
@Ashutosh, Queste informazioni non sono sufficienti per aiutarti. C'è un sacco di codice sopra, e ci sono alcune cose che posso immaginare che tu stia cambiando. Ti sei ricordato di rendere 'pathOverlay' una proprietà? In "handleGesture:", hai letto il codice, prendendo atto che ho ritagliato parti del tuo codice originale, per chiarezza? O hai semplicemente incollato l'intero metodo? Hai cambiato quelle statiche come ti ho suggerito? A questa riga: '[parentView addSubview: pathOverlay];', puoi fermarti nel debugger e assicurarti che 'parentView' non sia nullo? – Nate
@Ashutosh, inoltre, potrebbe essere necessario aggiornare la domanda di cui sopra, incollando il codice che stai utilizzando ** ora **, così posso aiutarti a eseguire il debug. Oppure inizia una nuova domanda se pensi che si stia accumulando troppo. La tua chiamata. – Nate