2011-05-04 14 views
7

He estado desarrollando un juego simple para iOS que implica arrastrar y usar rotaciones y otros reconocedores de gestos. El arrastre se realiza a través del touchesBegan/Moved/Ended y el reconocedor de rotación.Uso de la lógica de hitTest solo para toques reconocedores BEE y NO de gestos

Las vistas son de forma irregular, y las fronteras de vista a veces se superponen, por lo que implementan de Ole Belgeman UIImage+ColorAtPixel en mi vista de imagen y anularon isPointInside método en el principal elemento de vista . isPointInside invoca el método en picture view, que comprueba alfa en el punto de contacto y devuelve NO si se ha tocado la sección transparente. Esencialmente, hitTest ignora esta rama.

Pero el efecto secundario es que hitTest ignora todos los toques en la sección transparente, y el reconocedor de rotación solo funciona en la zona no transparente. Para algunos puntos de vista, que son demasiado pequeños en tamaño, se hace imposible utilizar el gesto de rotación :(

¿Hay alguna manera de evitar de alguna manera este problema y utilizar la lógica hitTestúnica para touchesBegan? Traté de trabajar la solución a cabo , pero parece que HitTest funciona estrictamente antes de cualquier manipulación táctil.

Comprobando la transparencia en touchesBegan funciona, pero cuando toca la sección transparente, que se superpone a la sección no transparente de la otra vista, esta última no recibe el toque.

No puedo entender el truco ...

Gracias de antemano por cualquier ayuda!

Respuesta

1

Me gustaría hacer el arrastre utilizar un UIPanGestureRecognizer, por lo que se puede implementar el método delegado -gestureRecognizer:shouldReceiveTouch: para volver NO cuando el reconocedor bandeja está considerando toques en el área transparente. Déjelo sin implementar o devuelva YES desde su reconocedor de rotación para recibir todo.

Además, el uso de reconocedores de gestos para ambos tipos de acciones tiene otros beneficios, como la posibilidad de especificar dependencias con -requireGestureRecognizerToFail:.

1

Intente comprobar si el parámetro UIEvent que pasó a pointInside: withEvent: cuando proviene del reconocedor de gestos, es diferente al pasado cuando llamó desde touchBegan/Moved/Ended.

Si es diferente, entonces supongo que esto está solucionando su problema.

Simplemente ponga un punto de ruptura o NSLog en pointInside para ver el parámetro Event en cada caso y vea si puede diferenciar.

¡Buena suerte!

Cuestiones relacionadas