2015-04-20 3 views
24

Я пытаюсь вложить ScrollViews в React Native; горизонтальный свиток с вложенными вертикальными свитками.React Родной вложенный ScrollView блокировки

Вот пример:

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); 

Внешний скроллер работает безупречно, но внутренние один палочки, когда вы касаетесь его, пока он движется. Я имею в виду: если вы прокрутите, поднимите свой палец и коснитесь его снова, пока он все еще движется с импульсом, он останавливается и не реагирует вообще, чтобы коснуться движений. Чтобы прокрутить больше, вам нужно снова поднять палец и снова коснуться.

Это настолько воспроизводимое, что это похоже на что-то связанное с Жестким Ответчиком.

Кто-нибудь видел эту проблему?

Как бы я даже начал отлаживать это? Есть ли способ увидеть, что реагирует на прикосновения, предоставление и освобождение, и когда?

Спасибо.

Update:

Похоже, это система Ответчика, поставив onResponderMove слушателей на внутренние и внешние скроллерах:

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

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

Это ясно, что внешний ScrollView захватывает контроль. Вопрос, я думаю, заключается в том, как остановить внешний скроллер от контроля при попытке прокрутки по вертикали? И почему это происходит только при попытке прокрутить уже движущийся внутренний ScrollView?

+1

Вы видите это поведение в t он тоже симулятор? Не сразу понятно, что вы пытаетесь сделать здесь, практически говоря - может быть, есть более простой метод. –

+1

Да. Случается и в симуляторе. Хорошим примером того, что я ищу, является Gilt. Вы можете перемещаться по вертикали через продукты и горизонтально через категории. Еще один - Netflix, хотя и обратный, поскольку у них есть несколько горизонтальных прокруток внутри вертикального. – nicholas

+1

Вы нашли решение на этом? Я не хочу изменять основной код. – TYRONEMICHAEL

ответ

5

Изменить node_modules/react-native/Libraries/Components/ScrollResponder.js: Строка 136 (См UPDATE):

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

UPDATE: Я считаю, если вид прокрутки в настоящее время анимации и хочет стать ответчиком, то он будет отвергать. Строка 189 в ScrollResponder.js. Так что я изменить линию 340 и это работает для меня:

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; 
}, 

Вы можете увидеть здесь: https://github.com/facebook/react-native/issues/41

+1

Это работает как шарм для меня !!!!!!! Большое спасибо!!! ты моя спасательная жизнь! –

+0

это сумасшедший взлом, но он работает для меня, спасибо – Cherniv

6

В вашем panresponder для внутренней один, попробуйте установить это:

onPanResponderTerminationRequest:() => false 
+0

Это сделало трюк для меня и для SliderIOS. –

+0

Я получаю это сообщение об ошибке: «Предупреждение: ScrollView не принимает отклонения хорошо - свитки в любом случае». У ScrollView, похоже, есть особые привилегии, в которых ему не нужно слушать. Есть ли другой вариант? –

2

Обертывание прокручивать содержимое вложенного ScrollView с исправленным для меня на Android-телефоне:

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

не помог мне :(используя RN 0.40 – ColCh

+0

@ColCh, может быть, у меня немного другая разметка .. – IlyaDoroshin

+0

не сработал для меня –

Смежные вопросы