Actualmente tengo una vista de mapa con algunas anotaciones sobre ella. Tengo la anotación con imágenes personalizadas. El problema que intento corregir es la sensibilidad de las imágenes. Cuando intento arrastrarlos, siento que tengo que tocar el centro exacto para enfocarlo. ¿Hay alguna manera de hacer que los límites táctiles sean más grandes?¿Cómo hago que un MKAnnotationView sea sensible al tacto?
Respuesta
Para hacer esto, necesita crear la subclase MKAnnotationView
para crear su propia MKAnnotationView
personalizada. En su subclase, anule las siguientes funciones:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
// Return YES if the point is inside an area you want to be touchable
}
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
// Return the deepest view that the point is inside of.
}
Esto permite presionar las vistas interactivas (como botones, etc.). La implementación predeterminada en MKAnnotationView
no es estricta en pointInside
y hitTest
porque permite que las prensas que están realmente dentro de una anotación se envíen a una anotación diferente. Esto se consigue calculando el centro de anotación más cercano al punto de contacto y enviando los eventos a esa anotación, esto es para que las anotaciones cercanas (superpuestas) no se bloqueen entre sí. Sin embargo, en su caso, es probable que desee bloquear otras anotaciones si el usuario debe seleccionar y arrastrar la anotación más alta, por lo que el método anterior es probablemente lo que desea o, de lo contrario, lo establecerá en la ruta correcta.
EDIT: me pidieron en comentarios para un ejemplo de implementación hitTest:withEvent:
- Esto depende de exactamente lo que usted está tratando de lograr. La pregunta original sugería tocar y arrastrar imágenes dentro de la anotación, mientras que en mi caso tengo algunos botones dentro de la anotación que quiero que sean interactivos.Aquí está mi código:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView* hitView = [super hitTest:point withEvent:event];
if (hitView != nil)
{
// ensure that the callout appears above all other views
[self.superview bringSubviewToFront:self];
// we tapped inside the callout
if (CGRectContainsPoint(self.resultView.callButton.frame, point))
{
hitView = self.resultView.callButton;
}
else if (CGRectContainsPoint(self.resultView.addButton.frame, point))
{
hitView = self.resultView.addButton;
}
else
{
hitView = self.resultView.viewDetailsButton;
}
[self preventSelectionChange];
}
return hitView;
}
Como se puede ver que es bastante simple - El MKAnnotationView
aplicación (llamado como super
en la primera línea de mi aplicación) sólo devuelve el primer punto de vista (más externa), no tiene niveles inferiores de los ver jerarquía para ver en qué subvista se encuentra realmente el toque. En mi caso, solo compruebo si el toque está dentro de uno de los tres botones y los devuelvo. En otras circunstancias, puede tener una perforación basada en un rectángulo simple a través de la jerarquía o pruebas de detección más complejas, por ejemplo, para evitar áreas transparentes dentro de su vista para permitir que los toques pasen por esas partes. Si necesita profundizar, se puede usar CGRectContainsPoint
de la misma manera que lo he usado, pero recuerde compensar sus puntos en coordenadas de vista local para cada nivel de vista que explora.
El método preventSelectionChange
es evitar que mi anotación personalizada se seleccione, la estoy usando como una leyenda personalizable/interactiva desde los pines del mapa y esto mantiene el pin relacionado a seleccionado en lugar de permitir que la selección cambie a esta anotación.
he implementado algo similar de la siguiente manera
- Crear una subclase de la clase de gestos Reconocedor que maneja toques
- crear una subclase de la clase UIImage, esta clase utiliza la clase reconocedor para manejar sus gestos
- Utilice esta en la anotación
el gesto reconocedor subclase manejará sus gestos si los realiza en cualquier punto de la ima ge. Esto debería ayudarte.
nos mantienen informados de si esta solución funcionó para u ...
Quizás quiso subclase MKAnnotationView o ¿Ha cambiado la acaba de establecer la propiedad de imagen de ella?
Aquí está la documentación para establecer la propiedad de la imagen.
Discusión: Asignación de una nueva imagen a esta propiedad también cambia el tamaño del marco de la vista para que coincida con la anchura y la altura de la nueva imagen. La posición del marco de la vista no cambia.
Compruebe el tamaño del marco de la vista de anotación, que es donde su objeto puede recibir toques.
@jhabbott solución nunca funcionó para mí, como mencioné here.
Tengo una imagen y una etiqueta una al lado de la otra. La imagen se demostró mediante el establecimiento de annotationview image
propiedad, y la etiqueta mediante la adición de un UILabel
I redirigido el método func point(inside:with:)
a la UILabel
uno (que incluía la zona de imagen) y hitTest
arrojó exactamente la misma vista si he hecho clic en el etiqueta o la imagen. Pero etiqueta de clic no produjo ninguna devolución de llamada ...
Finalmente, terminaron mediante la ampliación del marco de MKAnnotationView para encerrar etiqueta + imagen, me puse a annotationView.image
nil
, y creé mi costumbre UIImageView
.
Porque quería el punto de anclaje en el centro de la imagen, que tuvieron que establecer una personalizada:
self.frame = CGRect(x: 0, y: 0, width:
self.myLabel.frame.width, height: self.myLabel.frame.height)
self.centerOffset = CGPoint(x: self.frame.width/2, y: self.myImageView.frame.height/2)
Entonces yo borrado point(inside:with:)
y hitTest(point:with:)
anulaciones que no hicieron nada.
Y ahora, por primera vez, mi vista de anotación es completamente reactiva.
- 1. ¿cómo hago que este preg_match no sea sensible?
- 2. ¿Cómo puedo detectar si una pantalla es sensible al tacto?
- 3. ¿Cómo hago que mi comparación de cadenas sea insensible?
- 4. Android - ¿Cómo hacer que un ícono brille al tacto?
- 5. ¿Cómo hacer que mi mapeo de URL no sea sensible?
- 6. C# - ¿Cómo hacer que AutoMapper no sea sensible?
- 7. ¿Cómo hacer que la identificación amigable no sea sensible?
- 8. ¿Hace que mysql sea sensible a mayúsculas y minúsculas?
- 9. Asegúrese de que cierto área del mapa de bits sea transparente al tacto
- 10. ¿Cómo hago que mi JSON sea menos detallado?
- 11. ¿Cómo hago que una aplicación ASP.NET MVC sea multilingüe?
- 12. ¿Cómo hago que la búsqueda de Xpath sea insensible?
- 13. Cambiar el fondo del botón al tacto
- 14. ¿Cómo utilizar MKAnnotationView sin MKMapView?
- 15. Subclase MKAnnotationView
- 16. ¿cómo hago que un elemento sea un niño en sí mismo en XML Schema?
- 17. Android múltiples ImageView moviéndose al tacto
- 18. Android, ayuda girando la imagen al tacto
- 19. Mover UIView con relación al tacto
- 20. ¿Cómo ocultar MKAnnotationView Callout?
- 21. ¿Cómo hago flotar un div al centro?
- 22. ¿Cómo puedo hacer que mi formulario sea transparente, pero no lo que hago?
- 23. Cómo hacer que una columna sea sensible a mayúsculas y minúsculas en sql 2005 o 2008
- 24. Después de dividir un programa python en funciones, ¿cómo hago que una sea la función principal?
- 25. ¿Cómo hago que el tipo de devolución de un método sea genérico?
- 26. UIPageControl no responde al tacto, no cambia el punto
- 27. ¿Cómo hago que una casilla de verificación sea más pequeña que el tamaño predeterminado?
- 28. ¿Dónde puedo encontrar un iPhone OpenGL ES Ejemplo que responde al tacto?
- 29. iphone - previene que uiscrollview se desplace por el tacto
- 30. ¿Cómo puedo animar MKAnnotationView drop?
¿Podría implementar el método hitTest por favor? – Daniel
¡Si pudiera volver a votar su respuesta otra vez lo haría! Gracias por la actualización. – Daniel
Hola otra vez, ¿qué tal pointInside: withEvent:? ¿Es aquí donde propones que se implemente CGRectContainsPoint? – Daniel