Hvordan endrer jeg rammeposisjonen for en tilpasset MKAnnotationView?

stemmer
6

Jeg prøver å lage en tilpasset merknad visning av subclassing MKAnnotationViewog overstyring av drawRectmetoden. Jeg ønsker det sikte på å bli trukket forskjøvet fra kommentaren posisjon, noe som MKPinAnnotationViewgjør det, slik at spissen av tappen er ved de spesifiserte koordinater, snarere enn på midten av tappen. Så jeg setter rammen posisjon og størrelse som vist nedenfor. Men det ser ikke ut som jeg kan påvirke plasseringen av rammen i det hele tatt, bare størrelsen. Bildet ender opp med å bli trukket sentrert over kommentaren stilling. Noen tips om hvordan å oppnå det jeg ønsker?

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];
}
Publisert på 19/03/2010 klokken 17:13
kilden bruker
På andre språk...                            


4 svar

stemmer
19

Jeg prøvde å bruke centerOffset og for noen grunn bildet var i riktig posisjon når du zoomer inn, men som du zoomet kartet ut bildet ville bevege seg bort fra der den skulle være. Den fikse til dette var å sette bilderammen med offset. Her er koden jeg brukte (Du kan la ut bildeforklaring ting hvis du ikke har en bildeforklaring), jeg brukte pinnene fra her )

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

Juster centerOffset og calloutOffset som nødvendig for å passe ditt bilde, og ønsket midtpunktet, og callout punkt.

Svarte 31/05/2010 kl. 18:23
kilden bruker

stemmer
15

Snarere enn underklasse MKAnnotationView, har du prøvd å bruke en generisk MKAnnotationView og sette imageog centerOffsetegenskaper?

Svarte 19/03/2010 kl. 19:28
kilden bruker

stemmer
2

Din UIAnnotationViewer alltid trukket på samme skala, ikke kartets zoomnivået ikke saken. Det er derfor centerOffsetikke er bundet med zoomnivået.

annView.centerOffseter det du trenger. Hvis du ser at din pin er ikke på god plassering (for eksempel nederst i midten flytte litt når du endrer zoomnivået), er det fordi du ikke har angitt riktig centerOffset.

Forresten, hvis du ønsker å sette et punkt i koordinatsystemet nederst i midten av bildet, x-koordinat for din centerOffsetbør være 0.0f, som annotationView sentrum bildet som standard. Så prøv:

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

Svar fra [ MKAnnotation bildeforskyvningen med tilpassede pin bilde

Svarte 09/03/2013 kl. 16:46
kilden bruker

stemmer
-3

Takk for eksempel BadPirate.

Jeg prøvde å bruke UIImageview, men jeg tror ikke det er nødvendig.

Min klasse så ut som dette

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

    NSString *stitle;
}

Og gjennomføring

- (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;
}
Svarte 04/08/2011 kl. 07:14
kilden bruker

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