React Native:使用ScrollView时的垂直居中

Joh*_*ika 50 scrollview react-native

我正在使用React Native,一旦我引入ScrollView,我就无法保留元素的垂直居中.为了演示,我使用React Native Playground创建了3个应用程序.所有示例都有2页,可以通过点击蓝色按钮来切换它们.

例1:

第一个示例显示了在第2页上垂直居中的块.这是因为容器已应用这些样式:

flex: 1,
flexDirection: 'column',
justifyContent: 'center',
Run Code Online (Sandbox Code Playgroud)

https://rnplay.org/apps/lb5wSQ

但是,一旦切换到第2页就会出现问题,因为页面的整个内容都不合适,所以我们需要一个ScrollView.

例2

在这个例子中,我将所有内容都包装在ScrollView中.这允许第2页滚动,但现在我丢失了第1页的垂直居中.

https://rnplay.org/apps/DCgOgA

例3

为了试图找回1的垂直居中,我申请flex: 1到了contentContainerStyle滚动型的.这修复了第1页的垂直居中,但我不再能够一直向下滚动到第2页的底部.

https://rnplay.org/apps/LSgbog

我如何解决这个问题,以便我在第1页上获得元素的垂直居中,但仍然可以让ScrollView一直滚动到第2页的底部?

Jak*_*xon 145

我用flexGrow而不是flex解决了这个问题

<ScrollView contentContainerStyle={{flexGrow: 1}}>

这使得内容容器拉伸以填充ScrollView但不限制最大高度,因此当内容扩展ScrollView的边界时仍可以正确滚动

  • 太好了!好方案!应该被接受! (6认同)
  • 终于让我明白了flexGrow的用处 (5认同)
  • 它实际上仍然需要`&lt;ScrollView contentContainerStyle={{flexGrow: 1, justifyContent: 'center'}}&gt;`,如下面的答案中所述。 (3认同)

小智 47

这是我的方法:

使用外部容器flex : 1,然后滚动视图需要{flexGrow : 1, justifyContent : 'center'}使用contentContainerStyle,而不是style.

<View style={styles.mainContainer}>
  <ScrollView
    contentContainerStyle={{flexGrow : 1, justifyContent : 'center'}}>
      <View style={styles.scrollViewContainer}>
        //Put your stuff here, and it will be centered vertical
      </View>
  </ScrollView>
</View> 
Run Code Online (Sandbox Code Playgroud)

样式:

const styles = StyleSheet.create({scrollView : {
height : Dimensions.get('window').height, }, mainContainer : {
flex : 1 }, scrollViewContainer : { }, })
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 6

为了使 ScrollView 本身垂直居中,您需要具有这样的结构:

<View style={{flex: 1}}>
  <View>
   <ScrollView .../>
  </View>
</View>
Run Code Online (Sandbox Code Playgroud)

否则,如果您想让 ScrollView 内容本身居中,那么您需要以下内容:

<ScrollView contentContainerStyle={{flexGrow : 1, justifyContent : 'center'}} ...>
Run Code Online (Sandbox Code Playgroud)


Rad*_*rys 5

有一个新的解决方案(不幸的是,目前仅适用于 iOS)——我们可以centerContent在 Scrollview 上使用prop。

  • 这仅适用于 ios ,任何适用于 android 的选项? (2认同)