私は水平ScrollView in React NativeをAndroidで使用しようとしています。この場合、開始位置は(0,0)ではなくスクロール画像の中央にあります。
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:Androidでは、ScrollViewはそのサイズ<コンテンツのサイズの場合にのみスクロールできます
2:React Native 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());
}
そのため、アニメーションの後に遅らせる必要があります
componentDidMount() {
InteractionManager.runAfterInteractions(() => {
this.myScroll.scrollTo(100);
console.log("called DidMount");
})
}
これはReact Native 0.44.0で動作します。ヒント@Eldelshellに感謝します。また、任意のタイムアウト値で動作するようです。少なくともエミュレータ上では。InteractionManager.runAfterInteractions
は問題を修正するために何もしませんでしたが、おそらくそれはバージョンの違いです。
componentDidMount() {
setTimeout(() => {
this._scroll.scrollTo({y: 100})
}, 1)
}
遅延とタイマーの使用を避けたかったので、少し掘り下げた後、onLayout
を使用すると非常にスムーズに動作することがわかりました。
scrollToInitialPosition = () => {
this.scrollViewRef.scrollTo({ y: 100 });
}
...
<ScrollView
ref={(ref) => { this.scrollViewRef = ref; }}
onLayout={this.scrollToInitialPosition}
/>