Cómo progtwigr drag and drop con el complemento al área en Objective-C para IOS

Estoy buscando implementar algo en Objective-C para la plataforma IOS.

Quiero tener dos objects GUI, digamos que son UIImages por simplicidad y son forms cuadradas.

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

Quiero que el usuario pueda arrastrar una de las imágenes cuadradas al cuadrado vacío y mientras una parte de la image toque el cuadrado vacío, se insertá en ese cuadrado vacío y lo llenará. Y si dejan caer la image en cualquier otro lugar, vuelve a la location original.

También querrí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 se pueden colocar en el primer cuadrado vacío.

Supongo que habría un evento de caída que busco capturar y luego determinar si los metadatos de image coinciden con el cuadrado vacío en el que se está cayendo.

Si sabes de algún código de muestras o aplicaciones que hay, ciertamente puedo trabajar a través del código para entenderlo o si tienes algunos objects, events y properties para apuntarme a eso sería genial.

Esto no es para un juego tanto como una aplicación, así que preferiría no trabajar en ninguno de los motores de juego, pero si esa es una manera fácil de hacerlo, entonces estoy a favor.

Puede lograr esto con bastante facilidad. A la image, adjunta un UILongPressGestureRecognizer y, en el método de acción, actualiza la position de la image en function del movimiento de los dedos. Obtenga la location actual del gesto con - (CGPoint)locationInView:(UIView *) . Con cada movimiento, puede comprobar si el marco de la image se superpone al marco de su área de destino y, si lo hace, encájelo en su lugar.

Comprobar la superposition es bastante simple (la image y el destino dados son parte de la misma jerarquía de 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 retroceder la image si el usuario se cayó fuera, puede hacer que una animation de cuadro o centro regrese a la position original. Entonces, cuando comienza el arrastre, se llama a su método de acción. Verifica si su variable de instancia, llamémosla originalCenter , no es igual a CGPointZero . Si es así, grabe el centro actual en originalCenter.

Luego, cuando el usuario deja caer la image y es demasiado grande para el objective, lo mueve hacia atrás:

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