2012-02-10 6 views
9

Estoy buscando implementar algo en Objective-C para la plataforma IOS.cómo programar arrastrar y soltar con ajuste al área en Objective-C para IOS

Quiero tener dos objetos de la GUI, digamos que son UIImages por simplicidad y son de formas cuadradas.

Y luego tengo un elemento GUI "vacío" que es simplemente un cuadrado en gris del mismo tamaño.

Quiero que el usuario pueda arrastrar una de las imágenes cuadradas al cuadrado vacío y, siempre que una parte de la imagen toque el cuadrado vacío, se insertará en ese cuadrado vacío y lo rellenará. Y si dejan caer la imagen en cualquier otro lugar, se anima a la ubicación original.

También me gustaría tener otras 2 imágenes cuadradas y otro cuadrado vacío con la misma interacción, pero cada grupo de 2 imágenes y 1 cuadrado vacío no pueden funcionar entre sí. es decir, las dos primeras imágenes solo pueden soltarse en el primer cuadrado vacío.

Supongo que habrá algún evento de caída que quiero capturar y luego determino si los metadatos de imagen coinciden con el cuadrado vacío en el que se está insertando.

Si conoces algún ejemplo de código o aplicación, ciertamente puedo trabajar con el código para entenderlo o si tienes algunos objetos, eventos y propiedades para señalar que sería genial.

Esto no es tanto para un juego como para una aplicación, por lo que preferiría no trabajar en ninguno de los motores de los juegos, pero si eso es una manera fácil de hacerlo, estoy totalmente de acuerdo.

Respuesta

13

Puede lograr esto con bastante facilidad. A la imagen, adjuntas un UILongPressGestureRecognizer y en el método de acción, actualizas la posición de la imagen según el movimiento de los dedos. Obtén la ubicación actual del gesto con - (CGPoint)locationInView:(UIView *). Con cada movimiento, puede verificar si el marco de la imagen se superpone al marco de su área objetivo y, si lo hace, ajustarlo en su lugar.

Comprobación de solapamiento es bastante simple (dada la imagen y el objetivo que ambos son parte de la misma jerarquía de la vista):

CGRect imageRect = [image convertRect:image.frame toView:[image superview]]; 
CGRect targetRect = [target convertRect:target.frame toView:[image superview]]; 
if (CGRectIntersectsRect(imageRect, targetRect)) { 
    // overlap 
} 

Para regresar la imagen si el usuario ha bajado fuera, se puede hacer una fotograma o animación central a la posición original. Entonces, cuando comienza la resistencia, se llama a su método de acción. Compruebe si su variable de instancia, llamémoslo originalCenter, no es igual a CGPointZero. Si es así, registra el centro actual en originalCenter.

Entonces, cuando el usuario coloca la imagen y es enorme el objetivo, se mueve hacia atrás:

[UIView animateWithDuration:0.2 
       animations:^{ 
        image.center = originalCenter; 
        self.originalCenter = CGPointZero; 
        }]; 
+0

Gracias Pascal. Tengo algunas preguntas de seguimiento. Si solo quiero hacer esa intersección cuando el usuario hace una caída, ¿en qué evento debo hacer esa comparación? ¿Y sería en la imagen que estoy arrastrando o en la plaza en la que estoy cayendo? Y si el usuario cae fuera de mi casilla en blanco, ¿hay alguna animación prefabricada a la que pueda llamar para decirle a la imagen a qué X.Y volver y la animación o la velocidad de movimiento para usar? – user461051

+0

Encontré algunos artículos más sobre Stack Overflow que tienen algunos componentes de lo que estoy buscando. Me pregunto si coloco un método touchesEnded en el UIImage y veo si el X.Y de ese toque está en el CGRect del cuadrado vacío correcto. Luego, en ese punto, configure el X.Y de la esquina superior izquierda de la vista de la imagen como la esquina superior izquierda del cuadrado vacío.Todavía necesitaría encontrar la mejor manera de hacer que la imagen vuelva al original X.Y. – user461051

+0

Agregué un ejemplo de cómo podría volver a moverlo. ¿Eso ayuda? – Pascal