2011-05-13 3 views
6

So che ci sono post simili su Stack ma nulla di quello che ho trovato mi ha aiutato a trovare una soluzione.UIButton che ignorerà un 'trascinamento' e lo passerà a UIScrollView

  • Ho un ScrollView aggiunto ad una UIView.
  • Ho aggiunto un UIButton allo stesso UIView sopra la scrollview.

    1. Desidero che UIButton risponda a un touchUp e attivi un evento.
    2. Se qualcuno DRAGS su UIButton, lo voglio a passare l'evento a scrollView e trascinare l'UIScrollView senza attivare l'evento button.

so come passare su un tocco con hitTest restituzione del ScrollView ma questo si ferma nulla arrivare alla UIButton.

I non desidera aggiungere UIButton a UIScrollView.

Qualcuno ha una soluzione proposta?

risposta

0

Come spiegato in this answer, un UIButton o un altro UIControl che è una sottoview di una vista di scorrimento risponderà automaticamente ai tocchi mentre si lascia trascinare la maniglia della vista di scorrimento. Tuttavia, i pulsanti sottoview della vista di scorrimento si spostano anche con il contenuto a scorrimento, anziché rimanere nella stessa posizione sullo schermo mentre il contenuto scorre al di sotto di essi. Presumo che questo è il motivo per cui non vuoi mettere i pulsanti nella vista di scorrimento.

In questo caso, è possibile ottenere il comportamento desiderato con un ulteriore passaggio. Metti tutti i tuoi pulsanti in un UIView che è una sottoview della vista di scorrimento, quindi nel metodo scrollViewDidScroll del delegate della vista di scorrimento, imposta il frame.origin di quella vista su contentOffset della vista di scorrimento. L'ho appena implementato nella mia app e funziona benissimo, senza dover creare sottoclassi o essere coinvolto nella catena di risposta o negli eventi di tocco.

1

Prova questo:

  1. Aggiungere un trasparente, UIView personalizzato grande come l'intera vista di scorrimento contentSize alla vista di scorrimento, su tutti gli altri punti di vista. (O in alternativa, rendilo grande come la larghezza/altezza della vista di scorrimento e spostalo semplicemente ogni volta che la vista di scorrimento si muove.) Quando la vista di scorrimento decide di trasmettere i suoi tocchi alle sue sottoview invece di trascinare, questa sarà la prima cosa hitTested.
  2. Ignora il metodo hitTest per UIView. Controlla se il tocco è all'interno del riquadro dei pulsanti. Se lo è, restituisci il pulsante; in caso contrario, restituire nil.

In effetti, si sta ingannando la vista di scorrimento nel pensare che il pulsante sia una delle sue sottoview. Non sono sicuro che funzionerà come non l'ho provato, ma sembra del tutto ragionevole.

+0

Ho provato questo, ma non riuscivo a farlo funzionare. Il problema è che hitTest viene chiamato nella vista se si scorre la vista di scorrimento o semplicemente si tocca, in modo che il metodo hitTest personalizzato non sappia se passare l'evento alla vista di scorrimento o reindirizzarlo al pulsante. Ho anche provato a usare i tocchi nella vista personalizzata per calcolare se riceve un tocco o un tocco, ma quando viene chiamato Move, il metodo hitTest è terminato, quindi non c'è modo di rispondere condizionatamente lì. – arlomedia

1

Prova ad aggiungere uno UIPanGestureRecognizer allo UIBUtton. Nel callback specificato per gestire il pan (trascinamento), non è necessario implementare nulla. Quindi, impostare cancelsTouchesInView su SÌ.Ciò farà sì che il tuo pulsante trasmetta i gesti di trascinamento alle altre visualizzazioni.

 
     UIPanGestureRecognizer *gr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan)]; 
     [gr setCancelsTouchesInView:YES]; 
     [myButton addGestureRecognizer:gr]; 
     [gr release]; 

Ed ecco handlePan:

 
-(void)handlePan 
{ 
    // Do nothing 
} 

mi sono imbattuto in una situazione simile in cui ho avuto un UIScrollView con due UIView subviews. Ogni UIView conteneva uno UISlider. Volevo catturare (e rilasciare) i trascinamenti verticali (che è il punto in cui è arrivato il riconoscimento dei gesti), ma avevo anche bisogno di scroll orizzontali per lavorare nel cursore come ci si aspetterebbe E per scorrere la vista a scorrimento a sinistra e a destra. Questa era la soluzione. (Il riconoscitore di gesti è stato allegato a ogni UIView.)

+0

Non ha funzionato per me, anche se la mia configurazione è leggermente diversa. Piuttosto che una scrollView, ho solo una viewController con diverse viste su di essa che possono essere trascinate. Il mio problema è che alcune di queste sottoview hanno pulsanti (perché reagiscono per toccare), e i pulsanti bloccano il comportamento di trascinamento. Pensavo che questa risposta l'avrebbe risolta ma, ahimè, no. : \ Eventuali suggerimenti aggiuntivi sarebbero molto apprezzati. Grazie! – Olie

+0

Per chiarimenti, ho anche provato a duplicare il 'gr' sulla sottoview littler che contiene il pulsante, sperando di passare il pan fino alla sua superview. Nessuna gioia. – Olie

1

Provare questo: sottoclasse UIScrollView, restituire SÌ nei touchesShouldCancelInContentView: metodo.

+0

Lavora per me! Grazie mille ! :] – Jerome