iphone ios sdk mkannotationview callouts

iphone - MKAnnotationView personalizado: cómo capturar toques y NO descartar el texto destacado?



ios sdk (2)

Tengo una subclase MKAnnotationView personalizada. Está mostrando la vista exactamente como yo quiero. En esa vista, tengo un botón. Quiero capturar eventos en el botón para realizar una acción. Esto funciona bien.

Sin embargo, NO quiero que la llamada se descarte o desaparezca. Básicamente, tocar el botón en la llamada comenzará a reproducir un sonido, pero quiero dejar la anotación para que el usuario pueda presionar detener si así lo desea, sin tener que tocar el pin del mapa nuevamente para volver a hacer la anotación. En otra instancia, quiero que el botón táctil para animar más detalles en la llamada, por lo que definitivamente no quiero descartar la llamada en ese momento.

¿Cómo puedo evitar que la leyenda desaparezca cada vez que el usuario selecciona la leyenda o un botón dentro de la leyenda?


Esta puede no ser la mejor solución, pero definitivamente funciona. En primer lugar, probé varias cosas, como observar el contexto y demás, pero nunca pasé por alto y me pareció incómodo. Entonces, esto es lo que hice:

Primero especifiqué cuál era el factor de control para mantener una alerta visible. En mi caso, creé una vista de anotación personalizada, y cada vez que el usuario hace clic en un botón en esa vista personalizada, quiero que permanezca visible, y tal vez incluso cambie el contenido. Entonces, configuré un delegado en esa vista personalizada para que mi mapa pueda saber cuándo algo cambia. En mi controlador de vista de mapa, capturo ese mensaje y establezco una variable de miembro de clase en verdadero para indicar que quiero que permanezca la vista de anotación.

NOTA: Esto sucederá antes de que ocurran los mensajes de selección.

Ahora, en mi método didDeselectAnnotation, verifico el valor booleano. Si quiero mantenerlo visible, opto por NO eliminar mi anotación, restablezco el valor booleano y vuelvo a seleccionar la anotación manualmente, estableciendo la animación en NO. Esto permite que la anotación vea "permanecer" visible, tal vez una trampa, pero el usuario no puede ver la diferencia. Siempre que ese valor booleano indique que la anulación de selección está bien, simplemente elimino la anotación y todo está bien.

Entonces, el flujo de trabajo es este:

  1. Touch pin
  2. Se muestra CustomAnnotationView
  3. El usuario hace clic en un botón en CustomAnnotationView, que notifica al delegado (mapView) que se produjo la acción.
  4. Establezca el valor booleano de clase para saber que desea mantener la anotación alrededor
  5. mapView luego llama al método didDeselectAnnotation
  6. En el método didDeselectAnnotation, use condicional para decidir si debe eliminar la anotación, o mantenerla sin eliminar la anotación y volver a seleccionarla manualmente sin animación.

Espero que esto ayude a otros. Me tomó un tiempo resolver esto, así que espero que te ahorre tiempo.

Si encuentra una mejor solución, por supuesto, ¡publíquela aquí!