MKAnnotationView Subviews

Actuellement, j'ai un problème avec mon projet dans l'implémentation d'un MKAnnotationView personnalisé qui a plusieurs UIImageViews personnalisées. Donc, ces UIImageViews personnalisées ont un button clair au-dessus d'eux pour ne pas avoir à append de reconnaissance de gestes.

entrez la description de l'image ici

Comme vous pouvez le voir, il serait utile d'appuyer sur les sous-vues de MKAnnotationView et d'avoir une action.

J'ai implémenté un protocole pour le MKAnnotationView où chaque sous-vue d'image dans le MKAnnotationView fait un callback au controller qui est le propriétaire du MKMapView … Heres le code …

PHProfileImageView *image = [[PHProfileImageView alloc] initWithFrame:CGRectMake(newX - radius / 5.0f, newY - radius / 5.0f, width, height)]; [image setFile:[object objectForKey:kPHEventPictureKey]]; [image.layer setCornerRadius:image.frame.size.height/2]; [image.layer setBorderColor:[[UIColor whiteColor] CGColor]]; [image.layer setBorderWidth:2.0f]; [image.layer setMasksToBounds:YES]; [image.profileButton setTag:i]; [image.profileButton addTarget:self action:@selector(didTapEvent:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:image]; - (void)didTapEvent:(UIButton *)button { NSLog(@"%@", [self.pins objectAtIndex:button.tag]); if (self.delegate && [self.delegate respondsToSelector:@selector(didTapEvent:)]) { [self.delegate JSClusterAnnotationView:self didTapEvent:[self.pins objectAtIndex:button.tag]]; } } 

Donc, comme vous pouvez le voir, je tente déjà d'save le résultat de l'image tapée mais rien 🙁 Est-ce que la façon dont je suis en train de mettre en œuvre ce n'est pas le path à parcourir? Suis-je censé avoir CAShapeLayers ou quelque chose? point.Quelqu'un a des idées?

modifier

Im pensant que je pourrais avoir à implémenter une vue de légende personnalisée. Comme une vue de légende ajoute des buttons à sa vue et peut répondre à des events tactiles … Pas tout à fait sûr cependant parce que les légendes ne sont affichées qu'une fois que la vue d'annotation est tapée. Et dans ce cas, la vue d'annotation ACTUAL est l'label du milieu

J'ai donc redimensionné le cadre de mkannotationview à un cadre beaucoup plus grand et apparemment toutes les sous-vues ne sont pas réellement dans les limites de MKAnnotationView, donc les sous-vues ne sont pas réellement tapées. Maintenant que je pensais à cette solution, ce n'était probablement pas la meilleure solution.

Si quelqu'un a des suggestions plutôt que d'append des sous-vues à un MKAnnotationView pour créer la vue que j'ai actuellement, ce serait génial!

Pour le Custom AnnotationView avec des buttons cliquables, vous devez créer une sous-class AnnotationView personnalisée dans le projet. Pour cela, créez un nouveau file.

entrez la description de l'image ici

Et ajoutez ces deux methods au file d'implémentation.

 - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { UIView* hitView = [super hitTest:point withEvent:event]; if (hitView != nil) { [self.superview bringSubviewToFront:self]; } return hitView; } - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event { CGRect rect = self.bounds; BOOL isInside = CGRectContainsPoint(rect, point); if(!isInside) { for (UIView *view in self.subviews) { isInside = CGRectContainsPoint(view.frame, point); if(isInside) break; } } return isInside; } 

Ensuite, accédez à nouveau au file ViewController.m et modifiez la méthode viewDidLoad comme cela.

 - (void)viewDidLoad { [super viewDidLoad]; self.mapKit.delegate = self; //Set Default location to zoom CLLocationCoordinate2D noLocation = CLLocationCoordinate2DMake(51.900708, -2.083160); //Create the CLLocation from user cordinates MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 50000, 50000); //Set zooming level MKCoordinateRegion adjustedRegion = [self.mapKit regionThatFits:viewRegion]; //add location to map [self.mapKit setRegion:adjustedRegion animated:YES]; // create animation zooming // Place Annotation Point MKPointAnnotation *annotation1 = [[MKPointAnnotation alloc] init]; //Setting Sample location Annotation [annotation1 setCoordinate:CLLocationCoordinate2DMake(51.900708, -2.083160)]; //Add cordinates [self.mapKit addAnnotation:annotation1]; } 

Maintenant, ajoutez cette vue personnalisée à ViewController.xib.

Maintenant, créez cette méthode de délégué comme ci-dessous.

 #pragma mark : MKMapKit Delegate -(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation { AnnotationView *pinView = nil; //create MKAnnotationView Property static NSSsortingng *defaultPinID = @"com.invasivecode.pin"; //Get the ID to change the pin pinView = (AnnotationView *)[self.mapKit dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; //Setting custom MKAnnotationView to the ID if ( pinView == nil ) pinView = [[AnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; // init pinView with ID [pinView addSubview:self.customView]; addSubview:self.customView.center = CGPointMake(self.customView.bounds.size.width*0.1f, -self.customView.bounds.size.height*0.5f); pinView.image = [UIImage imageNamed:@"Pin"]; //Set the image to pinView return pinView; } 

J'ai aussi reçu cette réponse il y a quelques mois de quelqu'un posté sur Stackoverflow. Je l'ai modifié pour mon projet comme je le veux. J'espère que cela fera votre travail.