2011-04-24 16 views
7

He creado una MKAnnotationView personalizada para el usuario Localización:MKUserLocation ¡La vista personalizada no se mueve!

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 

{

if ([annotation isKindOfClass:[MKUserLocation class]]) { 

    if (navStatus == NavStatusHeadingEnabled) { 

     if ([annotation isKindOfClass:[MKUserLocation class]]) { 

      locationView = [[CustomLocationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationIdentifier"]; 
      return locationView; 

     } 

    } 

    return nil; 

} 

CustomLocationView.h

 - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier 
    { 
     self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
     if (self != nil) 
     { 


      self.backgroundColor = [UIColor clearColor]; 
      blueDot = [UIImage imageNamed:@"userLocationDot.png"].CGImage; 
      CGImageRetain(blueDot); 

      CGPoint blueDotCenter = CGPointMake((self.frame.size.width - (CGImageGetWidth(blueDot)/2))/2, (self.frame.size.height - (CGImageGetHeight(blueDot)/2))/2); 

      blueDotLayer = [CALayer layer]; 
      blueDotLayer.frame = CGRectMake(blueDotCenter.x, blueDotCenter.y , CGImageGetWidth(blueDot)/2, CGImageGetHeight(blueDot)/2); 
      blueDotLayer.contents = (id)blueDot; 
      blueDotLayer.shadowOpacity = 0.4; 
      blueDotLayer.shadowColor = [UIColor blackColor].CGColor; 
      blueDotLayer.shadowOffset = CGSizeMake(0.4, 0.3); 
      blueDotLayer.shadowRadius = 1.0f; 

      [self.layer insertSublayer:blueDotLayer above:self.layer]; 

     } 

     return self; 
    } 

- (void)setAnnotation:(id <MKAnnotation>)annotation 
{ 
    [super setAnnotation:annotation]; 

    [self setNeedsDisplay]; 
} 





- (void)dealloc { 

    [blueDotLayer release]; 


    [super dealloc]; 
} 

El problema es que sólo se queda en el mismo lugar y no se mueve como el punto azul ¿Qué estoy haciendo mal?

Gracias Factura.

+0

Sólo encontrado con este problema. ¿Hay alguna forma de manejarlo sin usar 'CLLocationManager'? – anticyclope

Respuesta

0

Bill,

Se necesita una CLLocationManager que se ha inicializado con un desiredAccuracy y distanceFilter aplicable y luego poner en práctica los métodos de delegado aplicables, y establecer su propio código como el delegado en la instancia locationManager.

Como mínimo debe tener el siguiente método que el Administrador de Ubicación llamará una vez que haya determinado la ubicación actual con la Precisión deseada y luego otra vez cada vez que se haya alcanzado el filtro de distancia.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation ; 

Cheers, Mack

+0

Hola Mack, gracias por tu respuesta. Ya estoy implementando los delegados de CLLocationManager. El punto azul está allí y se actualiza correctamente. Mi problema es cuando reemplaza el punto azul, con un AnnotationView personalizado usando (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id y comprobando si ([la anotación es KindOfClass: [MKUserLocation class]]), reemplazó el punto azul con mi vista personalizada, pero que ya no se actualiza, simplemente permanece quieto en el mismo lugar. – Nimrod7

5

me encontré con este problema en este momento también. No estoy seguro de si este comportamiento es esperado o no, pero por cualquier razón depende de nosotros mover nuestras vistas de anotación de MKUserLocation personalizadas.

Una solución ingenua es

- (void) locationController: (LocationController *) locationController 
     didUpdateToLocation: (CLLocation *) location 
{ 
    [[self mapView] setShowsUserLocation:NO]; 

    [[self mapView] setShowsUserLocation:YES]; 
} 

Pero esto hace que la actual ubicación de la anotación salto alrededor de la pantalla, que he encontrado indeseable.

Mejor aún es mantener una referencia a la vista de anotación personalizada como Ivar en su controlador de vista y luego hacer:

- (void) locationController: (LocationController *) locationController 
     didUpdateToLocation: (CLLocation *) location 
{ 
    CGPoint newCenterPoint = [[self mapView] convertCoordinate:[location coordinate] toPointToView:[[self customAnnotationView] superview]]; 
    newCenterPoint.x += [[self customAnnotationView] centerOffset].x; 
    newCenterPoint.y += [[self customAnnotationView] centerOffset].y; 

    [UIView animateWithDuration:0.3f animations:^{ 
     [[self customAnnotationView] setCenter:newCenterPoint]; 
    }]; 

} 

Esto es bueno, excepto cuando se cambia el nivel de zoom de la anotación se queda donde estaba relativa a la vista de la vista de mapa y luego se anima a la ubicación correcta solo después de que se completa el zoom o la panorámica. Lo mejor es seguir el ejemplo de Apple y crea la corriente de anotación ubicación desaparecer y reaparecer durante los cambios de región:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    [[self mapView] setShowsUserLocation:NO]; 
} 

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    [[self mapView] setShowsUserLocation:YES]; 
} 
0

que acaba de encontrar una respuesta para este problema. Mi código está en Monotouch, pero debería ser fácil volver a hacer lo mismo en ObjC. para mostrar una imagen personalizada por defecto MKUserLocation necesitamos agregar una subvista sobre la original. Para ello, anular DidAddAnnotationViews en MKMapView delegado

void DidAddAnnotationViews (object sender, MKMapViewAnnotationEventArgs e) 
{ 
      MKAnnotationView v = mapView.ViewForAnnotation(mapView.UserLocation); 
      if(v != null) 
      { 
       if(v.Subviews.Count() == 0) 
       { 
        UIImageView iv = new UIImageView(new RectangleF(0,0, 22, 22)); 
        iv.Image = UIImage.FromFile("res/pins/Yhere.png"); 
        v.AddSubview(iv); 
        v.BringSubviewToFront(iv); 
       } 
      } 
} 

Esto le da a la imagen personalizada en movimiento en la parte superior del punto azul. Además, las funciones de seguimiento del usuario y actualizaciones de ubicación funcionan perfectamente y aún se pueden ver círculos azules que indican la precisión de la ubicación.

Diviértete personalizando MKUserLocation!

0

Aquí está la respuesta de Apple Developer Soporte Técnico

acabo de terminar de hablar con los ingenieros MapKit y confirmado que se trata de un error en iOS. Mi aplicación de prueba está experimentando el mismo problema.

No sé si esto se fijó en iOS 6, la respuesta es para el iOS 5.

Cuestiones relacionadas