2015-04-20 30 views
24

Sto tentando di annidare ScrollViews in React Native; una pergamena orizzontale con scroll verticali annidati.React Native scrolled ScrollView nidificato

Ecco un esempio:

var Test = React.createClass({ 
    render: function() { 
     return (
      <ScrollView 
       style={{width:320, height:568}} 
       horizontal={true} 
       pagingEnabled={true}> 

       {times(3, (i) => { 
        return (
         <View style={{width:320, height:568}}> 

          <ScrollView> 
           {times(20, (j) => { 
            return (
             <View style={{width:320, height:100, backgroundColor:randomColor()}}/> 
            ); 
           })} 
          </ScrollView> 

         </View> 
        ); 
       })} 

      </ScrollView> 
     ); 
    }, 
}); 

AppRegistry.registerComponent('MyApp',() => Test); 

La barra di scorrimento esterno funziona perfettamente, ma quella interna bastoni quando si tocca mentre è in movimento. Ciò che intendo è: se scorri, alza il dito e lo tocchi di nuovo mentre è ancora in movimento con lo slancio, si arresta e non reagisce affatto ai movimenti tattili. Per scorrere di più devi alzare il dito e toccare di nuovo.

Questo è così riproducibile che sembra essere qualcosa a che fare con il Gesture Responder.

Qualcuno ha visto questo problema?

Come potrei iniziare a eseguire il debug di questo? C'è un modo per vedere cosa risponde ai tocchi, concedere e rilasciare e quando?

Grazie.

Aggiornamento:

Sembra che è il sistema di risponditore, mettendo onResponderMove ascoltatori sulle scrollers interno ed esterno:

<ScrollView 
    onResponderMove={()=>{console.log('outer responding');}} 
    ... 

    <ScrollView 
     onResponderMove={()=>{console.log('inner responding');}}> 
     ... 

E 'chiaro che lo ScrollView esterno è afferrando il controllo. La domanda, immagino, è: come posso impedire che lo scroller esterno prenda il controllo quando si prova a scorrere verticalmente? E perché questo succede solo quando provi a scorrere un ScrollView interno già in movimento?

+1

Vedete questo comportamento in t anche lui simulatore? Non è immediatamente chiaro cosa stai cercando di fare qui, praticamente parlando - forse c'è un metodo più semplice. –

+1

Sì. Succede anche nel simulatore. Un buon esempio di ciò che sto cercando è Gilt. Puoi scorrere verticalmente attraverso i prodotti e orizzontalmente attraverso le categorie. Un altro è Netflix, anche se invertito in quanto hanno più pergamene orizzontali all'interno di uno verticale. – nicholas

+1

Hai trovato una soluzione a questo? Non voglio modificare il codice principale. – TYRONEMICHAEL

risposta

5

Modifica node_modules/react-native/Libraries/Components/ScrollResponder.js: Linea 136 (Vedi UPDATE):

scrollResponderHandleScrollShouldSetResponder: function(): boolean { 
    return this.state.isTouching; 
}, 

UPDATE: Trovo se la vista di scorrimento è attualmente animando e vuole diventare il risponditore, allora rifiuterà. Riga 189 in ScrollResponder.js. Così modifico linea 340 e il lavoro per me:

scrollResponderIsAnimating: function(): boolean { 
    // var now = Date.now(); 
    // var timeSinceLastMomentumScrollEnd = now - this.state.lastMomentumScrollEndTime; 
    // var isAnimating = timeSinceLastMomentumScrollEnd < IS_ANIMATING_TOUCH_START_THRESHOLD_MS || 
    // this.state.lastMomentumScrollEndTime < this.state.lastMomentumScrollBeginTime; 
    // return isAnimating; 
    return false; 
}, 

Potete vedere qui: https://github.com/facebook/react-native/issues/41

+1

Funziona come un fascino per me !!!!!!! Grazie mille!!! sei il mio risparmiatore di vita !!! –

+0

questo è un hack matto, ma funziona per me, grazie – Cherniv

6

Nella vostra panresponder per quella interna, provare ad impostare questo:

onPanResponderTerminationRequest:() => false 
+0

Questo ha fatto il trucco per me anche per 'SliderIOS'. –

+0

Ricevo questo messaggio di errore: "Attenzione: ScrollView non accetta bene il rifiuto - scorre comunque". ScrollView sembra avere privilegi speciali in cui non è necessario ascoltare. C'è un'altra opzione? –

2

Wrapping contenuto scorrevole di ScrollView annidato con risolto questo per me su Android:

<ScrollView> 
    ... 
    <ScrollView horizontal> 
    <TouchableWithoutFeedback> 
     { /* your scrollable content goes here */ } 
    </TouchableWithoutFeedback> 
    </ScrollView> 
</ScrollView> 
+0

non mi ha aiutato: (usando RN 0.40 – ColCh

+0

@ColCh, forse ho un markup leggermente diverso .. – IlyaDoroshin

+0

non ha funzionato per me –