Come faccio a cambiare la posizione della cornice per una consuetudine MKAnnotationView?

voti
6

Sto cercando di fare una vista annotazione personalizzato sottoclassi MKAnnotationViewe l'override del drawRectmetodo. Voglio la vista da trarre compensato dalla posizione della nota, un po 'come MKPinAnnotationViewlo fa, in modo che la punta del perno in corrispondenza delle coordinate specificate, piuttosto che al centro del perno. Così ho impostato la posizione della cornice e formato come mostrato di seguito. Tuttavia, non sembra che posso influenzare la posizione della cornice a tutti, solo la dimensione. L'immagine finisce per essere disegnata centrata sulla posizione nota. Eventuali suggerimenti su come ottenere ciò che voglio?

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];
}
È pubblicato 19/03/2010 alle 18:13
fonte dall'utente
In altre lingue...                            


4 risposte

voti
19

Ho provato ad utilizzare centerOffset e per qualche motivo l'immagine era nella giusta posizione utilizzando lo zoom in, ma come si ingrandito mappa l'immagine sarebbe allontanarsi da dove doveva essere. La correzione per questo è stato l'impostazione della cornice dell'immagine con l'offset. Ecco il codice che ho usato (È possibile lasciare la roba richiamo, se non si dispone di un richiamo), ho usato i pin da qui )

#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;
}

Regolare centerOffset e calloutOffset come necessario per soddisfare la vostra immagine e punto centrale desiderato, e il punto di richiamo.

Risposto il 31/05/2010 a 19:23
fonte dall'utente

voti
15

Invece di sottoclasse MKAnnotationView, hai provato utilizzando un MKAnnotationView generica e impostando le imagee centerOffsetproprietà?

Risposto il 19/03/2010 a 20:28
fonte dall'utente

voti
2

La vostra UIAnnotationViewsia disegnato sempre la stessa scala, della mappa livello di zoom non importa. Ecco perché centerOffsetnon è vincolata con il livello di zoom.

annView.centerOffsetè quello che ti serve. Se vedete che il vostro pin non è in buona posizione (ad esempio, il centro fondo si muove un po 'quando si cambia il livello di zoom), è perché non è stato impostato il giusto centerOffset.

A proposito, se si desidera impostare il punto del punto in basso al centro dell'immagine, la coordinata x della vostra centerOffsetdovrebbe essere 0.0f, come il centro annotationView l'immagine di default. Allora prova :

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

Risposta [da immagine MKAnnotation compensare immagine Perno personalizzato con

Risposto il 09/03/2013 a 17:46
fonte dall'utente

voti
-3

Grazie per l'esempio BadPirate.

Ho provato ad utilizzare UIImageView, ma io non penso che sia necessario.

La mia classe si presentava così

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

    NSString *stitle;
}

E l'attuazione

- (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;
}
Risposto il 04/08/2011 a 08:14
fonte dall'utente

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