Se busca: Cómo seleccionar de manera fiable y consistente una anotación MKMapView

votos
29

Después de llamar a MKMapView 's setCenterCoordinate: animada: método (sin animación), me gustaría llamar a selectAnnotation: animado: (con animación) de manera que la anotación se sale del pasador de nueva centrada en el.

Por ahora, simplemente observo mapViewDidFinishLoadingMap y luego selecciono la anotación. Sin embargo, esto es problemático. Por ejemplo, este método no se llama cuando no hay necesidad de cargar datos de mapas adicionales. En esos casos, mi anotación no está seleccionada.:(

Muy bien. Podría llamar esto inmediatamente después de establecer la coordenada central en su lugar. Ahh, pero en ese caso es posible que no es datos de los mapas para cargar (pero no se ha terminado de cargar con todo). Me arriesgaría a llamarlo demasiado pronto, con la animación volviéndose irregular en el mejor de los casos.

Por lo tanto, si lo entiendo correctamente, no se trata de saber si mi coordenada es visible, ya que es posible perder casi una pantalla llena de distancia y tener que cargar nuevos datos del mapa. Más bien, se trata de saber si los datos del nuevo mapa deben cargarse y luego actuar en consecuencia.

¿Alguna idea sobre cómo lograr esto, o cómo seleccionar (de manera confiable) una anotación después de volver a centrar la vista del mapa en la coordenada donde vive esa anotación?

Pistas apreciadas, ¡gracias!

Publicado el 10/08/2009 a las 20:53
fuente por usuario
En otros idiomas...                            


7 respuestas

votos
36

Me encontré con el mismo problema, pero encontré lo que parece ser una solución fiable y razonable:

  1. Poner en práctica el método delegado MAPview: didAddAnnotationViews :. Cuando traté de seleccionar la anotación directamente dentro del método delegado, la llamada se redujo con el pasador! Que parecía extraño, por lo que añadir un ligero retardo de medio segundo.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Seleccione la anotación inicial como era de esperar, pero selectAnnotation llamando: animada;

    -(void)selectInitialAnnotation {
        [self.mapView selectAnnotation:self.initialAnnotation animated:YES];
    }
    

Parece que selectAnnotation:animated:no se llama en algunas condiciones. Comparar con documentos MKMapView :

Si la anotación especificado no está en pantalla, y por lo tanto no tiene una vista de anotación asociada, este método no tiene ningún efecto.

Respondida el 16/02/2010 a las 01:06
fuente por usuario

votos
7

Una forma más consistente que el uso de un tiempo de espera fijo es escuchar a la regionDidChangedevolución de llamada. Establecer coordinar el centro del mapa a la anotación deseada, y cuando se llama al método regionDidChange, a continuación, seleccione la anotación en el centro, para abrir la llamada.

He aquí un pequeño vídeo que tomé de la cosa corriendo al azar entre 5 pines.

En primer lugar, ir a la coordenada del centro de la anotación. Digamos que el objeto de anotación es nombrado thePin.

- (void)someMethod {
    [map setCenterCoordinate:thePin.coordinate animated:YES];
}

Luego, en el regionDidChangemétodo, seleccione esta anotación.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Respondida el 12/11/2010 a las 06:23
fuente por usuario

votos
4

Así lo digo, esto es lo que dicen los documentos,

Si la anotación especificado no está en pantalla, y por lo tanto no tiene una vista de anotación asociada, este método no tiene ningún efecto.

Así que si quiero llamar setCenterCoordinate:animated:o setRegion:animated:y luego quiero para seleccionar la anotación llamando, selectAnnotation:animated:, no quede seleccionada la anotación y la llamada no aparecerá pd de la misma razón exacta se mencionó anteriormente en documentos, por lo que la forma en que sería genial tener algo así, setCenterCoordinate:animated:ComletionBlockpero no es allí ..! La forma en que trabajó para mí es como abajo,

 [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.mapView setCenterCoordinate:location.coordinate animated:YES];
    } completion:^(BOOL finished) {
        [self.mapView selectAnnotation:location animated:YES];
    }];

Esto le dará un bloque de terminación y U puede utilizar eso para seleccionar la anotación.

Respondida el 14/08/2013 a las 06:43
fuente por usuario

votos
4

Lo que funcionó para mí fue llamar selectAnnotation:animated:desde el mapView:didAddAnnotationViews:método:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
    [mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}

Documentación de Apple sobre el mismo aquí .

Tenga en cuenta que solo tenía una anotación en el mapa, así que [[mapView annotations] lastObject]estaba bien para mis propósitos. Su experiencia puede ser diferente.

Respondida el 02/11/2009 a las 19:44
fuente por usuario

votos
2

Estaba teniendo un problema similar. Estaba usando el MKPinAnnotationView predeterminado con animatesDrop: YES. Después de que agregué las anotaciones al MKMapView, estaba haciendo esto:

[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]

que en la lógica de mi programa, debería seleccionar la anotación más cercana. Esto no estaba funcionando. Descubrí el motivo: la vista de anotación no estaba en la pantalla en el momento de esta llamada de selección, debido a la animación de colocación de pin. Así que todo lo que hice fue configurar un temporizador para seleccionar la anotación un segundo después. Es un truco, pero funciona. Sin embargo, no estoy seguro de si funcionará en todas las situaciones, por ejemplo en 3G vs. 3Gs. Sería mejor averiguar la función de devolución de llamada correcta para ponerlo.

selectTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
               selector:@selector(selectClosestAnnotation) userInfo:nil
               repeats:NO];

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Respondida el 15/12/2009 a las 18:49
fuente por usuario

votos
1

He encontrado varios problemas con todas las soluciones que vi para mi problema (Quiero seleccionar una anotación cuando he añadido desde viewDidAppear):

  1. Utilizando el mapView:didAddAnnotationViews:método de delegado.

    Esto no funcionó para mí, porque si la anotación especificado no está en pantalla, y por lo tanto no tiene una vista de anotación asociada, este método no tiene ningún efecto.

  2. Utilizando el mapViewDidFinishLoadingMap:método de delegado.

    Esto no funcionó para mí, ya sea porque el mapa se almacena en caché ahora, por lo que el método se llama sólo una vez, la primera vez.

Solución:

John Blackburn estaba muy cerca, pero sin el mapView:didAddAnnotationViews:método. Acabo de llamar a mi propio selectAnnotation:método, antes de agregar la anotación, con un retraso:

[self.mapView addAnnotation:ann];
[self performSelector:@selector(selectAnnotation:) withObject:ann afterDelay:0.5];

Y esto es lo que hago en mi selectAnnotation:método:

- (void)selectAnnotation:(id < MKAnnotation >)annotation
{
   [self.mapView selectAnnotation:annotation animated:YES];
}

Probado en dos iPhone 3GS (iOS 5 y 6) y un iPhone 5.

Respondida el 23/10/2012 a las 09:31
fuente por usuario

votos
0

Estaba teniendo dificultades similares, pero en realidad no pude hacer que este método funcionara en absoluto, y mucho menos de manera inconsistente.

Esto es lo que encontré para trabajar. Quizás también funcione para usted: ¿Cómo desencadenar la vista de llamada de MKAnnotationView sin tocar el pin?

Respondida el 24/08/2009 a las 03:53
fuente por usuario

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