2012-11-12 14 views
6

Sto imparando iOS e non riesco a trovare come aggiungere il trascinamento e rilasciare il comportamento a UIView.Semplice drag & drop per una vista?

ho provato:

[_view addTarget:self action:@selector(moved:withEvent:) forControlEvents:UIControlEventTouchDragInside]; 

Si dice "alcuna interfaccia visibile per UIView dichiara selettore addTarget (etc)"

Inoltre ho provato ad aggiungere un sistema di riconoscimento gesto padella, ma non so se questo è quello che mi serve

- (IBAction)test:(id)sender { 
     NSLog(@"dfsdfsf"); 
    } 

Si chiama, ma non so come ottenere le coordinate dell'evento. Qual è il modo standard e semplice in iOS per registrare una richiamata per gli eventi di spostamento/trascinamento della selezione?

Grazie in anticipo.

risposta

12

A UIPanGestureRecognizer è decisamente la scelta giusta.Se si desidera che all'utente di trascinare la vista in giro, è necessario il “traduzione” (movimento) del gesto nel sistema di coordinate del superview:

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:_view.superview]; 

Una volta che hai la traduzione, si può spostare (“drag “) la vista cambiando la sua center:

CGPoint center = _view.center; 
    center.x += translation.x; 
    center.y += translation.y; 
    _view.center = center; 

Infine, si desidera impostare traduzione il gesto del riconoscitore pan di nuovo a zero, così la prossima volta che si ottiene il messaggio, si dice solo quanto il gesto si è spostato dall'ultimo messaggio:

[recognizer setTranslation:CGPointZero inView:_view.superview]; 
} 

Qui è tutto insieme per un facile copia/incolla:

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:_view.superview]; 

    CGPoint center = _view.center; 
    center.x += translation.x; 
    center.y += translation.y; 
    _view.center = center; 

    [recognizer setTranslation:CGPointZero inView:_view.superview]; 
} 
+0

l'utente deve aggiungere questo nel viewDidLoad: UIPanGestureRecognizer * panner = [[UIPanGestureRecognizer alloc] initWithTarget: auto azione: @selector (panWasRecognized:)]; [_viewaddGestureRecognizer: panner]; –

+1

Oppure puoi aggiungere il riconoscitore di gesti nello storyboard o XIB. –

+0

giusto, ma quando ho seguito la tua risposta non sapevo che fosse necessario, quindi non ha funzionato con me: D –

4

Inizia con touchesBegan, touchesMoved, touchesEnded. Esegui l'override di questi nella sottoclasse di UIView e sarai sulla buona strada per imparare il sistema degli eventi. È possibile ottenere l'evento coordinate in questo modo:

- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event 
{ 
    float x = [[touches anyObject] locationInView:self].x; 
    float y = [[touches anyObject] locationInView:self].y; 
} 

Poi c'è un sacco di roba per la conversione di coordinate tra i diversi punti di vista e così via. Una volta capito, puoi lavorare con la roba UIGestureRecognizer che hai già trovato, che è ciò di cui hai bisogno.

Avrai bisogno di un indicatore di movimento pan per eseguire il trascinamento. Puoi utilizzare il selettore locationInView: in UIPanGestureRecognizer per scoprire dove ti trovi in ​​un dato momento.

si aggiunge il sistema di riconoscimento gesto in questo modo, non con la roba target-azione si stava tentando:

UIPanGestureRecognizer *dragDropRecog = [[UIPanGestureRecognizer alloc] initWithTarget:yourView action:@selector(thingDragged:)]; 
[yourView addGestureRecognizer:dragDropRecog]; 

poi si deve implementare il selettore thingDragged: nella vista:

- (void) thingDragged:(UIPanGestureRecognizer *) gesture 
{ 
    CGPoint location = [gesture locationInView:self]; 
    if ([gesture state] == UIGestureRecognizerStateBegan) { 
     // Drag started 
    } else if ([gesture state] == UIGestureRecognizerStateChanged) { 
     // Drag moved 
    } else if ([gesture state] == UIGestureRecognizerStateEnded) { 
     // Drag completed 
    } 
} 

È Traduceremo la vista trascinata nel bit modificato e gestiremo il calo nella sezione finale.