¿Cómo se cambia la posición del marco de una costumbre MKAnnotationView?

votos
6

Estoy tratando de hacer una vista de anotación personalizada subclasificando MKAnnotationViewy reemplazando el drawRectmétodo. Quiero la vista que se puede sacar desplazado de la posición de la anotación, algo así como MKPinAnnotationViewlo hace, por lo que el punto del pasador se encuentra en las coordenadas especificadas, en lugar de la mitad de la espiga. Así que me puse la posición y el tamaño de la trama, como se muestra a continuación. Sin embargo, no parece que pueda afectar a la posición del marco en absoluto, sólo el tamaño. La imagen termina siendo dibujado centrada sobre la posición de anotación. ¿Algún consejo sobre cómo lograr lo que quiero?

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];
}
Publicado el 19/03/2010 a las 18:13
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
19

He intentado utilizar centerOffset y por alguna razón la imagen estaba en la posición correcta cuando se acerca, pero a medida que has el mapa a cabo la imagen se movería lejos de donde se supone que es. La solución a esto fue el establecimiento del marco de imagen con el desplazamiento. Aquí está el código utilicé (Usted puede dejar de lado el material de llamada si no tiene una llamada), he utilizado los pasadores de aquí )

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

Ajuste centerOffset y calloutOffset según sea necesario para adaptarse a su imagen, y el punto central deseada, y el punto de llamada.

Respondida el 31/05/2010 a las 19:23
fuente por usuario

votos
15

En lugar de subclase MKAnnotationView, has utilizando un MKAnnotationView genérica y el establecimiento de los imagey centerOffsetlas propiedades?

Respondida el 19/03/2010 a las 20:28
fuente por usuario

votos
2

Su UIAnnotationViewsiempre se dibuja en la misma escala, el nivel de zoom del mapa, no importa. Es por eso que centerOffsetno está vinculado con el nivel de zoom.

annView.centerOffsetes lo que necesita. Si usted ve que su pin no está en la buena ubicación (por ejemplo, la parte inferior central se mueve un poco cuando se cambia el nivel de zoom), es porque no ha definido la derecha centerOffset.

Por cierto, si desea establecer el punto de la coordenada en el centro inferior de la imagen, la coordenada x de su centerOffsetdebe ser 0.0f, como centro de annotationView la imagen por defecto. Así que trate de:

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

Respuesta [de imagen MKAnnotation compensar imagen Contacto personalizado con

Respondida el 09/03/2013 a las 17:46
fuente por usuario

votos
-3

Gracias por el ejemplo BadPirate.

He intentado utilizar UIImageView, pero no creo que sea necesario.

Mi clase era la siguiente

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

    NSString *stitle;
}

Y la puesta en práctica

- (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;
}
Respondida el 04/08/2011 a las 08:14
fuente por usuario

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