Comment puis-je modifier la position du cadre pour une MKAnnotationView personnalisée?

voix
6

Je suis en train de faire une vue d'annotation personnalisée par le sous - classement MKAnnotationViewet redéfinissant la drawRectméthode. Je veux que la vue à tirer décalée par rapport à la position de l'annotation, un peu comme le MKPinAnnotationViewfait, de sorte que le point de l'axe est aux coordonnées spécifiées, plutôt qu'au milieu de la broche. Je me suis donc la position du cadre et la taille comme indiqué ci - dessous. Cependant, il ne semble pas que je peux affecter la position du cadre du tout, seulement la taille. L'image finit par être dessinée centrée sur la position de l' annotation. Des conseils sur la façon d'obtenir ce que je veux?

MyAnnotationView.h:

@interface MyAnnotationView : MKAnnotationView {

}

MyAnnotationView.m:

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        self.canShowCallout = YES;
        self.backgroundColor = [UIColor clearColor];
        // Position the frame so that the bottom of it touches the annotation position 
        self.frame = CGRectMake(0, -16, 32, 32);
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    [[UIImage imageNamed:@blue-dot.png] drawInRect:rect];
}
Créé 19/03/2010 à 18:13
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
19

J'ai essayé d' utiliser centerOffset et pour une raison quelconque l'image était dans la bonne position lors d'un zoom, mais comme vous avez la carte l'image éloignerait d'où il était censé être. Le correctif à ce réglage a été le cadre d'image avec l'offset. Voici le code je (Vous pouvez laisser les trucs callout si vous ne disposez pas d' une légende), je les broches d' 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;
}

Régler centerOffset et calloutOffset au besoin en fonction de votre image, et point central désiré, et le point de callout.

Créé 31/05/2010 à 19:23
source utilisateur

voix
15

Plutôt que de la sous - classe MKAnnotationView, avez - vous essayé d' utiliser un MKAnnotationView générique et en définissant les imageet centerOffsetpropriétés?

Créé 19/03/2010 à 20:28
source utilisateur

voix
2

Votre UIAnnotationViewest toujours tiré à la même échelle, le niveau de zoom de la carte n'a pas d' importance. Voilà pourquoi centerOffsetn'est pas lié au niveau de zoom.

annView.centerOffsetest ce que vous avez besoin. Si vous voyez que votre NIP est pas au bon emplacement (par exemple, le centre de fond bouger un peu lorsque vous modifiez le niveau de zoom), il est parce que vous n'avez pas défini le droit centerOffset.

Soit dit en passant, si vous souhaitez définir le point de coordonnées au centre en bas de l'image, la coordonnée x de votre centerOffsetdevrait être 0.0f, comme centre annotationView l'image par défaut. Essayez donc:

annView.centerOffset = CGPointMake(0, -imageHeight / 2);

Réponse de [ l' image MKAnnotation décalage avec l' image de la broche personnalisée

Créé 09/03/2013 à 17:46
source utilisateur

voix
-3

Merci pour l'exemple BadPirate.

J'ai essayé d'utiliser UIImageView, mais je ne pense pas qu'il est nécessaire.

Ma classe était comme ça

@interface ImageAnnotationView : MKAnnotationView {
    UIImageView *_imageView;
    id m_parent;
    BusinessMapAnnotation *m_annotation;

    NSString *stitle;
}

Et la mise en œuvre

- (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;
}
Créé 04/08/2011 à 08:14
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more