2015-10-19 73 views
8

我想在Android的React Native水平的ScrollView中使用水平ScrollView,其中起始位置在滾動圖像的中間而不是(0,0)。反應原生的Android ScrollView的scrollTo不工作

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

我遇到了同樣的問題,浪費幾個小時吧: 在android系統1,滾動視圖可以當它的大小<內容大小 2反應原生的Android,如果只調用滾動scrollView.scrollTo()在componentDidMount,它不會工作,滾動視圖因爲...有創建時的佈局動畫,可以在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"); 
    }) 
} 
+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()'有點草率。 –