2015-10-19 5 views
8

水平スクロールビューをReact Native Androidで使用しようとしています。開始位置は(0,0)ではなくスクロールイメージの中央になります。本物のAndroid ScrollViewに対応するscrollは機能しません

scrollToメソッドは、componentDidMount内で正しく呼び出されたようですが、アプリケーション内で何も動かず、スクロールをすべて左端から開始するように表示されます。

これはAndroidなので、私はcontentOffsetの小道具にアクセスすることはできません。あるいは、ドキュメンテーションに従って直接設定することもできます。ここでは、コードは次のとおりです。

'use strict'; 

var React = require('react-native'); 
var { 
    StyleSheet, 
    View, 
    Text, 
    ScrollView, 
    Component, 
} = React; 
var precomputeStyle = require('precomputeStyle'); 

class Carousel extends Component { 
    constructor(props, context) { 
    super(props, context); 
    //this.changeContent = this.changeContent.bind(this); 
    } 

    componentDidMount() { 
    this.myScroll.scrollTo(100); 
    console.log("called DidMount"); 
    } 

    render() { 
    return (
     <View style={{flex: 1}}> 
     <ScrollView ref={(ref) => this.myScroll = ref} 
      contentContainerStyle={styles.container} 
      horizontal={true} 
      pagingEnabled={true} 
      showsHorizontalScrollIndicator={false} 
      bounces={true} 
      onMomentumScrollEnd={this.onAnimationEnd} 
     > 
      {this.props.children} 
     </ScrollView> 
     </View> 
    ); 
    } 

    onAnimationEnd(e) { 
    console.log("curr offset: " + e.nativeEvent.contentOffset.x); 
    } 
} 

var styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    justifyContent: 'center', 
    }, 
    page: { 
    alignItems: 'center', 
    justifyContent: 'center', 
    borderWidth: 1, 
    }, 
}); 

module.exports = Carousel; 
+1

Y座標も追加できますか?例えば。 'scrollTo(100、0)'。 – Felix

+0

私はそうして、問題は同じままです。欠落している座標は、指定されていなければ、デフォルトでゼロになります。 –

+0

実際には 'scrollTo(y、x)'だと思いますが、その構文は非難されています。今は 'scrollTo({x:n、y:n、animated:bool})'です。Robがこれを述べたように、必要に応じて 'x'、' y'、 'animated'を省略することができます。 – PhilT

答えて

26

私はそれで同じ問題、および廃棄物のいくつかの時間を満たす: 1アンドロイドで、scrollviewはあなたが呼び出す場合、そのサイズ<コンテンツのサイズが中 2は、ネイティブのAndroidを反応させた場合にのみスクロールすることができますcomponentDidMountでscrollView.scrollTo()、それはscrollviewを作成するときに、あなたがそうReactScrollView.java

protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    // Call with the present values in order to re-layout if necessary 
    scrollTo(getScrollX(), getScrollY()); 
} 

でそれを見つけることができ、レイアウトのアニメーションを持っているbecaus、アニメーション

後にそれを遅らせる必要があり、動作しません。
componentDidMount() { 
    InteractionManager.runAfterInteractions(() => { 
     this.myScroll.scrollTo(100); 
     console.log("called DidMount"); 
    }) 
} 
+1

ありがとうございました!どのようにしてこれをデバッグしましたか? –

+2

このソリューションは機能しますが、この関数内に遅延を追加する必要がありました: '_.delay(()=> this._scroll.scrollTo({x:1000、animated:false})、100);' – Eldelshell

+0

インタラクションマネージャーが私のためにScrollViewで働かなくても遅れました。私はこの問題に関して良いリソースを見つけるのに苦労したので、コードに答えを投稿します。 – PhilT

5

これはReact Native 0.44.0で動作します。ヒント@Eldelshellをありがとう。また、タイムアウト値を使用しているようにも見えます。少なくともエミュレータ上で。私はInteractionManager.runAfterInteractionsを含む答えは問題を解決するために何もしなかったが、おそらくそれはバージョンの違いだと分かった。

componentDidMount() { 
    setTimeout(() => { 
    this._scroll.scrollTo({y: 100}) 
    }, 1) 
} 
+0

この回答は、ScrollViewの初期アニメーションが1ms以内に終了したことを前提としています。これはほとんどの場合発生する可能性がありますが、保証されていません。そのため、 'InteractionManager.runAfterInteractions()'が推奨される解決策であり、 'setTimeout()'がやや乱暴なのはこのためです。 –

関連する問題