2010-03-19 16 views
6

Estoy tratando de hacer una vista de anotación personalizada mediante la subclasificación de MKAnnotationView y anulando el método drawRect. Quiero que la vista se dibuje desplazada de la posición de la anotación, algo así como MKPinAnnotationView, de modo que la punta del pin esté en las coordenadas especificadas, en lugar de en el medio del pin. Así que configuro la posición y el tamaño del marco como se muestra a continuación. Sin embargo, no parece que pueda afectar la posición del marco, solo el tamaño. La imagen termina siendo dibujada centrada sobre la posición de anotación. ¿Algún consejo sobre cómo lograr lo que quiero?¿Cómo cambio la posición del marco para una MKAnnotationView personalizada?

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

Respuesta

15

En lugar de subclase MKAnnotationView, has utilizando un MKAnnotationView genérica y el establecimiento de las image y centerOffset propiedades?

+0

Sí, que trabaja para una vista de anotación basada en imágenes (que en realidad es suficiente para mis propósitos). Pero todavía tengo curiosidad sobre el caso general. – andrei

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 establecer el marco de la 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 here)

#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 deseaba punto central y punto de llamada.

+1

Usted dijo "La solución a esto era establecer el marco de imagen con el desplazamiento", pero el código proporcionado no resuelve el problema. ¿Puedes elaborar?centerOffset no parece estar haciendo nada en iOS7 (en iOS6 estaba bien) –

+1

Estoy usando una forma totalmente diferente para mi vista de anotación y esto no parece solucionar el problema. Además, no creo que esta solución tenga nada que ver con el ajuste de la posición de la anotación según el nivel de zoom. –

+0

Experimenté esto también. Tuve que configurar el CenterOffset en 0,0 o bien tradujo la imagen junto con el mapa moviéndose en alguna función de la relación x/y de compensación. No estoy seguro por qué. –

-3

Gracias por el ejemplo BadPirate.

Intenté usar UIImageview, pero no creo que sea necesario.

Mi clase se veía así

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

    NSString *stitle; 
} 

Y la aplicación

- (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; 
} 
2

Su UIAnnotationView siempre está dibujado a la misma escala, el nivel de zoom del mapa no importa. Es por eso que centerOffset no está vinculado con el nivel de zoom.

annView.centerOffset es lo que necesita. Si ve que su pin no está en la buena ubicación (por ejemplo, el centro inferior se mueve un poco cuando cambia el nivel de zoom), es porque no configuró el centerOffset correcto.

Por cierto, si desea establecer el punto de la coordenada en la parte inferior central de la imagen, la coordenada x de su centerOffset debe ser 0.0f, ya que anotación centrar la imagen de forma predeterminada. Así que trate de:

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

Respuesta de [MKAnnotation image offset with custom pin image

+3

gracias ha funcionado –

+0

contento de oírlo;) – VICTORGS3

+5

Copia agradable de esta respuesta: http://stackoverflow.com/a/8165645/674009 – mattyohe

Cuestiones relacionadas