J'essaie de faire une vue sur l'annotation personnalisée par sous-classement myannotationView.h: p> myannotationView.m: p> mkannotationview code> et remplacer la méthode
Drawrect code>. Je veux que la vue soit décalée de la position de l'annotation, quelque peu comme
mkpinannotationview code> le fait, de sorte que le point de la broche soit aux coordonnées spécifiées, plutôt que le milieu de la goupille. Donc, je réglais la position de la trame et la taille comme indiqué ci-dessous. Cependant, il ne semble pas que je puisse affecter la position du cadre du tout, seule la taille. L'image finit par être dessinée centrée sur la position d'annotation. Tous les conseils sur la manière de réaliser ce que je veux?
4 Réponses :
plutôt que sous-classe Mkannotationview, avez-vous essayé d'utiliser un MKANnotationView générique et définir le image code> et
CentreOffset code> Propriétés? P>
Oui, cela fonctionne pour une vue d'annotation basée sur une image (qui est suffisamment suffisante à mes besoins). Mais je suis toujours curieux du cas général.
J'ai essayé d'utiliser CentryOffset et pour une raison quelconque, l'image était dans la bonne position lorsqu'elle est zoomée, mais lorsque vous avez zoomé, l'image s'éloigne de l'endroit où elle était censée être. Le correctif à ceci définit le cadre d'image avec le décalage. Voici le code que j'ai utilisé (vous pouvez laisser les trucs de callout si vous n'avez pas de callout), j'ai utilisé les broches de ICI )
#pragma mark MKMapViewDelegate - (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation { if(![annotation isKindOfClass:[MyAnnotation class]]) // Don't mess user location return nil; MKAnnotationView *annotationView = [aMapView dequeueReusableAnnotationViewWithIdentifier:@"spot"]; if(!annotationView) { annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"spot"]; annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [(UIButton *)annotationView.rightCalloutAccessoryView addTarget:self action:@selector(openSpot:) forControlEvents:UIControlEventTouchUpInside]; annotationView.enabled = YES; annotationView.canShowCallout = YES; annotationView.centerOffset = CGPointMake(7,-15); annotationView.calloutOffset = CGPointMake(-8,0); } // Setup annotation view annotationView.image = [UIImage imageNamed:@"pinYellow.png"]; // Or whatever return annotationView; }
Vous avez dit "le correctif à ceci définissait le cadre d'image avec le décalage", mais le code fourni ne résout pas le problème. Peux-tu élaborer? CenterOffset ne semble pas faire quoi que ce soit sur iOS7 (sur iOS6 c'était bien)
J'utilise une forme totalement différente pour ma vue d'annotation et cela ne semble pas résoudre le problème. De plus, je ne pense pas que cette solution ait quelque chose à voir avec l'ajustement de la position de l'annotation selon le niveau de zoom.
J'ai aussi expérimenté cela. Je devais régler la centrale sur 0,0 ou elle a traduit l'image avec la carte en mouvement à une fonction du rapport x / y offset. Pas certain de pourquoi.
Merci pour l'exemple Badirate.
J'ai essayé d'utiliser UiImageView, mais je ne pense pas que ce soit nécessaire. p>
Ma classe ressemblait à ceci p>
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; self.frame = CGRectMake(0, 0, kWidth, kHeight); self.backgroundColor = [UIColor clearColor]; self.m_annotation = (BusinessMapAnnotation*)annotation; NSString* categoryTitle = m_annotation.sCTitle; NSString* l_titleString = @"NearPin.png"; if (categoryTitle!= nil ) { if ([categoryTitle length] > 0) { //NSLog(@"%@", categoryTitle); l_titleString = [NSString stringWithFormat:@"Map%@.png", categoryTitle]; //NSLog(@"%@", l_titleString); } } self.stitle = m_annotation.sTitle; _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:([stitle isEqualToString:@"You are here"]) ? @"Pushpin_large.png":l_titleString]]; _imageView.contentMode = UIViewContentModeCenter; _imageView.frame = CGRectMake(kBorder, kBorder, kWidth, kHeight); [self addSubview:_imageView]; _imageView.center = ([stitle isEqualToString:@"You are here"]) ? CGPointMake(15.0, -10.0):CGPointMake(kWidth/2, 0.0); return self; }
Votre Au fait, si vous souhaitez définir le point de la coordonnée au centre inférieur de l'image, la coordonnée X de votre réponse de [ Mkannotation Image Décalage avec une photo personnalisée Image P> P> uiannotationview code> est toujours dessiné à la même échelle, le niveau de zoom de la carte n'a pas d'importance. C'est pourquoi
CentreOffset code> n'est pas lié avec le niveau de zoom.
Annview.centeroffset code> est ce dont vous avez besoin. Si vous voyez que votre code PIN n'est pas au bon endroit (par exemple, le centre inférieur se déplace un peu lorsque vous modifiez le niveau de zoom), c'est parce que vous n'avez pas défini le bon
CentreOffset code>. p>
CentreOffset code> doit être 0.0F, comme l'annotationview Center de l'image par défaut. Alors essayez: p>
Oui, je l'ai eu de cette réponse, malade le lier dans mon poteau :)