Wie kann ich die Rahmenposition MKAnnotationView für eine benutzerdefinierte ändern?

stimmen
6

Ich versuche , eine benutzerdefinierte Anmerkung Ansicht zu machen , indem Subklassen MKAnnotationViewund Überschreiben der drawRectMethode. Ich mag die Ansicht von der Position der Annotation - Offset gezogen werden, etwa wie MKPinAnnotationViewes tut, so dass der Punkt des Stiftes an den angegebenen Koordinaten ist, statt in der Mitte des Stiftes. So stelle ich die Rahmenposition und Größe wie unten dargestellt. Allerdings sieht es nicht , wie ich überhaupt die Position des Rahmens beeinflussen kann, nur die Größe. Das Bild endet gezogen wird über die Anmerkung Position zentriert. Irgendwelche Tipps, wie man das erreichen , was ich will?

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];
}
Veröffentlicht am 19/03/2010 um 18:13
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
19

Ich habe versucht , centerOffset und aus irgendeinem Grunde mit dem Bild in der richtigen Position war , als in gezoomt, aber wie Sie die Karte aus dem Bild vergrößert würde wegziehen , von wo es eigentlich sein sollte. Das Update dazu war den Bildrahmen mit der Offset - Einstellung. Hier ist der Code , den ich verwendet (Sie können die callout Sachen auslassen , wenn Sie nicht über eine callout haben), habe ich die Stifte von 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;
}

Stellen Sie centerOffset und calloutOffset nach Bedarf Ihr Bild zu entsprechen, und die gewünschten Mittelpunkt, und callout Punkt.

Beantwortet am 31/05/2010 um 19:23
quelle vom benutzer

stimmen
15

Anstatt Unterklasse MKAnnotationView, haben Sie versucht , eine generische MKAnnotationView verwenden und die Einstellung imageund centerOffsetEigenschaften?

Beantwortet am 19/03/2010 um 20:28
quelle vom benutzer

stimmen
2

Sie UIAnnotationViewwird immer im gleichen Maßstab gezeichnet, die Zoomstufe der Karte keine Rolle spielt. Deshalb centerOffsetnicht mit der Zoomstufe gebunden ist.

annView.centerOffsetist das, was Sie brauchen. Wenn Sie sehen , dass Sie Ihre PIN nicht an der guten Lage sind (zum Beispiel bewegt sich die unten in der Mitte ein wenig , wenn Sie die Zoomstufe ändern), ist es , weil Sie nicht das Recht festgelegt haben centerOffset.

By the way, wenn Sie den Punkt der Koordinate an der unteren Mitte des Bildes einstellen möchten, die x - Koordinate des centerOffset0.0f sein sollte, als AnnotationView Mitte das Bild standardmäßig. Also versuche :

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

Antwort von [ MKAnnotation Bildversatz mit benutzerdefinierten Stift Bild

Beantwortet am 09/03/2013 um 17:46
quelle vom benutzer

stimmen
-3

Vielen Dank für das Beispiel BadPirate.

Ich habe versucht, UIImageView, aber ich glaube nicht, dass es notwendig ist.

Meine Klasse sah wie folgt aus

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

    NSString *stitle;
}

Und die Umsetzung

- (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;
}
Beantwortet am 04/08/2011 um 08:14
quelle vom benutzer

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