2011-10-24 21 views
6

Casi no hay información que hay sobre esto, así que aquí está mi problema:iOS Touches (Auto) Offset en IPAD

estoy trabajando en un reproductor de 2 'sentarse frente a unos de otros' juego ipad y el jugador quién está en el lado opuesto tiene dificultades para tocar los botones ... porque parece que Apple cambia automáticamente el toque en función de la orientación del dispositivo (que es ideal para el uso regular o el reproductor principal). ¿Hay alguna manera de restablecerlo o decirle al iPad que no haga eso? (Por cierto iPhone hace esto también)

Esto es todo lo que he encontrado: Dada esta aparente contradicción, he decidido simplemente engañar por la apertura de las partes en movimiento 'límites' de manera que hay un área de el usuario debe presionar debajo del área de la parte. En general, los usuarios parecen golpear debajo de un objeto en lugar de sobre él, por lo que no se dan cuenta del cambio causado por iOS.

Entonces, si no hay una manera fácil de evitar la compensación, ¿es la única solución para cambiar los límites de cada uiview (o subclase) para el jugador opuesto? ¿O eso es correcto?

Cualquier respuesta apreciada.

Respuesta

3

EDITAR: ¡Vaya chicos, finalmente encontré la manera! Hice una subclase de UIView e hice que mi vista de juego (que alberga todos los UIScrollViews, UIButtons, etc.) use esa subclase. Y entonces este era el único código añadí a la subclase:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGPoint touchSpot = point; 
    if (![[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"] && touchSpot.y < 512) 
    { 
     touchSpot = CGPointMake(touchSpot.x, touchSpot.y+10); 
    } 

    UIView *hitView = [super hitTest:touchSpot withEvent:event]; 

    if (hitView == self) 
     return self; // you can return nil here if you want touches to go through this view (ie transparent space in a HUD overlay or w/e) 

    return hitView; 
} 

Hasta ahora esto ha funcionado muy bien ... la persona que se sienta en el extremo opuesto tiene buena respuesta táctil al igual que el jugador en el lado "casa" . Cuidado con la presentación de puntos de vista sobre la parte superior de este punto de vista, aunque ... todo va a ir a través de ese método ...

solución antiguo (antes de encontrar eso ^):

Bueno, ahora mismo mi solución tiene estado en la subclase uigesturerecognizer, reenviar CUALQUIER toque (es decir, sin restricciones en el reconocedor) y luego agregarlo a la vista de mi juego. Entonces, el método que responde a cualquier toque solo se ejecuta cuando el estado finaliza, y si es así, luego pasa a recorrer cada subvista (no muchas) para ver si el contacto cruzó una. Además, para el jugador opuesto, compara el rect un poco (para cada una de las subvistas).

Veré si puedo encontrar una manera más eficiente ... pero hasta ahora está bien.

También podría haber hecho que mi juego fuera una subclase uiview y anular los toques comenzados/movidos/finalizados, pero ya tenía todo colocado, así que fui con el reconocedor (sin tener que subclasificar uiview).

3

Sí, la compensación táctil existe, su tamaño no está documentado y no puede cancelarse (al menos, con la API pública).

Tiene que realizar una ingeniería inversa del desplazamiento. Simplemente mostraría un pequeño círculo donde UIKit dice que está tocando y luego lo ajustaré por prueba y error. Cuando tiene el desplazamiento, puede aplicarlo manualmente (-2 * desplazamiento) en los manejadores de eventos solo para el jugador opuesto.

No puedo decir qué tan bien va a sentir, tienes que experimentar un poco.

+0

Correcto para toques Puedo rastrearme a mí mismo Puedo hacerlo, pero ¿qué pasa con UIButtons o cosas en una vista de tabla que no están tanto bajo mi control? Ya eliminaron un toque perdido.Alguna sugerencia para esto? Gracias. – cclogg

+0

Para afectar a todos los toques, debe anular 'sendEvent:' en el nivel UIWindow/UIApplication, pero no puede modificarlos de todos modos. El problema aquí es que para "arreglar" la maquinaria de ajuste táctil de Apple (que muy probablemente ocurre en el nivel del controlador) * en todas partes *, debe usar API privadas como se describe aquí: http://cocoawithlove.com/2008/10/ synthesizing-touch-event-on-iphone.html, pero no lo recomendaría porque es un * muy, muy * peligroso pirateo. – Costique

+0

Maldita sea, está bien. Bueno, estoy mirando los límites de una vista ... Me pregunto si podría desactivar el recorte, luego compensar los límites de una vista por -10 píxeles, y luego compensar el marco de una vista por +10 píxeles (marcos para el segundo jugador). A pesar de cualquier cosa de colisión/posición, tendría que recordar comprobar -10 píxeles en el cuadro. – cclogg

Cuestiones relacionadas