2010-08-18 12 views
34

Ho una vista di scorrimento che usava scorrere quando non aveva pulsanti dappertutto. Ora lo fa, e quando si trascina il mouse (sul simulatore) non succede nulla (penso perché i pulsanti vengono spinti). Come posso fare questo giusto?ScrollView non scorre quando si trascinano i pulsanti

+1

Hai provato su un dispositivo fisico, ci sono molte differenze tra i dispositivi e il simulatore, e il mouse e multi-touch è una delle più grandi! –

risposta

92

Questo sta accadendo perché UIButton subviews del UIScrollView (presumo che i pulsanti siano aggiunti come sottoview nel tuo caso) stanno tracciando i tocchi e non la vista di scorrimento. UIScrollView metodo touchesShouldCancelInContentView è la chiave qui. Secondo la sua descrizione: "Il valore restituito predefinito è SÌ se la vista non è un oggetto UIControl, altrimenti restituisce NO.", Ovvero per gli oggetti UIControl (pulsanti), UIScrollView non tenta di annullare i tocchi che impediscono lo scorrimento.

Così, per consentire lo scorrimento con tasti:

  1. Assicurarsi UIScrollView proprietà canCancelContentTouches è impostato su YES.
  2. sottoclasse UIScrollView e sovrascrivere touchesShouldCancelInContentView per tornare YES quando il contenuto oggetto punto di vista è un UIButton, come questo:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
{ 
    if ([view isKindOfClass:[UIButton class]]) { 
     return YES; 
    } 

    return [super touchesShouldCancelInContentView:view]; 
} 
+0

grazie per la risposta. Ho cambiato lo scroll con le immagini per simulare i pulsanti (e tenere traccia di tocchi per sapere quando chiamare un metodo) Proverò comunque la tua soluzione e vedrò come funziona. Grazie! – DanielaM

+4

@DanielaM Se questa meravigliosa risposta ti ha aiutato come sembra, sarebbe bello accettarlo. – iHunter

+0

** bold ** @Roman K - Sei il mio EROE! Ho passato 2 giorni a leggere in molti post \ forum su questo problema sovrapposto ma nessuna modifica o soluzione ha funzionato davvero. La tua soluzione funziona davvero !! Cheers :-) – Shvalb

9

ho fondato questa domanda cercando la soluzione rapida per questo problema, ho "tradotto" piace questo:

class UIButtonScrollView: UIScrollView { 

    override func touchesShouldCancelInContentView(view: UIView!) -> Bool { 
     if (view.isKindOfClass(UIButton)) { 
      return true 
     } 

     return super.touchesShouldCancelInContentView(view) 

    } 

} 

speranza che questo potrebbe aiutare

4

Swift 3 Soluzione

override func touchesShouldCancel(in view: UIView) -> Bool { 
    if view is UIButton { 
     return true 
    } 
    return super.touchesShouldCancel(in: view) 
} 
Problemi correlati