Hoe kan ik de positie van het kader voor een aangepaste MKAnnotationView veranderen?

stemmen
6

Ik ben op zoek naar een aangepaste annotatie uitzicht door subklassen maken MKAnnotationViewen overschrijven van de drawRectmethode. Ik wil het oog te trekken ten opzichte van de positie van de annotatie van, enigszins willen MKPinAnnotationViewdoet, zodat het punt van de pen op de aangegeven coördinaten, in plaats van het midden van de pen. Dus ik stel de positie en de grootte van het kader zoals hieronder afgebeeld. Echter, het maakt niet uit als ik de positie van het frame helemaal kunnen beïnvloeden, alleen de grootte. Het beeld uiteindelijk getrokken gecentreerd over de annotatie positie. Eventuele tips over hoe om te bereiken wat ik wil?

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];
}
De vraag is gesteld op 19/03/2010 om 18:13
bron van user
In andere talen...                            


4 antwoorden

stemmen
19

Ik heb geprobeerd met behulp van centerOffset en een of andere reden was het beeld in de juiste positie wanneer ingezoomd, maar als je de kaart uitgezoomd zou het beeld weg van waar het moest bewegen te zijn. De oplossing voor dit was het instellen van het beeldframe met de offset. Hier is de code die ik gebruikte (Je kan je bij het bijschrift spul als je niet beschikt over een bijschrift hebben), gebruikte ik de pinnen van hier )

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

Pas centerOffset en calloutOffset als nodig is om uw afbeelding aan te passen, en de gewenste middelpunt en bijschrift punt.

antwoordde op 31/05/2010 om 19:23
bron van user

stemmen
15

In plaats van subklasse MKAnnotationView, heb je geprobeerd met behulp van een generieke MKAnnotationView en het instellen van de imageen centerOffseteigenschappen?

antwoordde op 19/03/2010 om 20:28
bron van user

stemmen
2

Je UIAnnotationViewwordt altijd op dezelfde schaal getekend, is van de kaart zoomniveau niet toe. Dat is de reden waarom centerOffsetis niet gebonden met het zoomniveau.

annView.centerOffsetis wat je nodig hebt. Als je ziet dat uw pincode niet op de goede locatie (bijvoorbeeld het midden onderaan een beetje bewegen wanneer u het zoomniveau te wijzigen), dan is dat omdat u niet de juiste hebt ingesteld centerOffset.

By the way, als je wilt naar het punt van de coördinaten onderaan in het midden van het beeld, de x-coördinaat van uw set centerOffsetmoet 0.0f, als annotationView centrum van het beeld door standaard. Dus probeer :

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

Antwoord [van het MKAnnotation gecompenseerd aangepaste afbeelding speld met

antwoordde op 09/03/2013 om 17:46
bron van user

stemmen
-3

Bedankt voor het voorbeeld BadPirate.

Ik probeerde met behulp van UIImageView, maar ik denk niet dat het nodig is.

Mijn klas zag er zo uit

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

    NSString *stitle;
}

En de uitvoering

- (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;
}
antwoordde op 04/08/2011 om 08:14
bron van user

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