2012-02-10 7 views
9

Sto cercando di implementare qualcosa in Objective-C per la piattaforma IOS.come programmare il drag and drop con lo snap all'area in Objective-C per IOS

Voglio avere due oggetti GUI, diciamo che sono UIImages per semplicità e sono forme quadrate.

E quindi ho un elemento GUI "vuoto" che è solo un quadrato in grigio della stessa dimensione.

Desidero che l'utente sia in grado di trascinare una delle immagini quadrate sul quadrato vuoto e fintanto che una parte dell'immagine tocca il quadratino vuoto, scatterà in quel quadrato vuoto e lo riempirà. E se rilasciano l'immagine in qualsiasi altro punto, torna alla posizione originale.

Inoltre, vorrei avere 2 altre immagini quadrate e un altro quadrato vuoto con la stessa interazione ma ogni gruppo di 2 immagini e 1 quadrato vuoto non può funzionare l'uno con l'altro. cioè le prime due immagini possono essere lasciate cadere solo nel primo quadrato vuoto.

Suppongo che ci sarebbe qualche evento di rilascio che sto cercando di acquisire e quindi determinare se i meta dati dell'immagine corrispondono al quadrato vuoto in cui è stato inserito.

Se siete a conoscenza di esempi di codice o app là fuori, posso certamente lavorare attraverso il codice per capire o se avete alcuni oggetti, eventi e proprietà per indicarmi che sarebbe fantastico.

Questo non è per un gioco tanto quanto un'app, quindi preferirei non lavorare in nessuno dei motori di gioco, ma se questo è un modo semplice per farlo, allora sono tutto per quello.

risposta

13

È possibile ottenere questo abbastanza facilmente. All'immagine, alleghi un UILongPressGestureRecognizer e nel metodo di azione, aggiorni la posizione dell'immagine in base al movimento del dito. Ottieni la posizione attuale del gesto con - (CGPoint)locationInView:(UIView *). Ad ogni movimento, è possibile verificare se la cornice dell'immagine si sovrappone alla cornice dell'area target e, in tal caso, scattare in posizione.

Verifica di sovrapposizione è abbastanza semplice (data immagine e di destinazione sono entrambi parte della stessa gerarchia della vista):

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

Per spostare di nuovo l'immagine, se l'utente è sceso al di fuori, è possibile effettuare una animazione di fotogramma o centro nella posizione originale. Quindi, quando inizia il trascinamento, viene chiamato il metodo di azione. Si controlla se la variabile di istanza, chiamiamola originalCenter, non è uguale a CGPointZero. Se lo è, registri il centro corrente in originalCenter.

Poi, quando l'utente rilascia l'immagine ed è fuori misura il bersaglio, si sposta indietro:

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

Grazie Pascal. Ho alcune domande di follow-up. Se desidero solo effettuare la chiamata intersect quando l'utente esegue una sospensione, quale evento dovrei effettuare il confronto tra intersezioni? E sarebbe nell'immagine che sto trascinando o nella piazza in cui mi sto lanciando? E se l'utente cade al di fuori del mio quadrato vuoto, c'è qualche animazione premade che posso chiamare per dire all'immagine quale X.Y tornare e l'animazione o la velocità di movimento da usare? – user461051

+0

Ho trovato alcuni altri articoli su Stack Overflow che hanno alcuni componenti di ciò che sto cercando. Mi chiedo se inserisco un metodo Ended nella UIImage e vediamo se il X.Y di quel tocco è nel CGRect del quadrato vuoto corretto. Quindi a quel punto imposta la X.Y in alto a sinistra nella vista dell'immagine in modo che sia la parte in alto a sinistra del quadrato vuoto.Avrei ancora bisogno di capire il modo migliore per far tornare l'immagine all'X.Y. originale. – user461051

+0

Ho aggiunto un esempio di come è possibile spostarlo indietro. Questo aiuta? – Pascal