使用flex 1的ScrollView使其不可滚动

时间:2017-10-18 07:45:57

标签: react-native flexbox react-native-android react-native-scrollview

我正在尝试在ScrollView上运行flex,只要ScrollView有flex: 1滚动内部就不起作用。 这里是世博会小提琴(你可以运行这个代码并玩) https://snack.expo.io/SySerKNp-

请注意,如果您从flex: 1中移除ScrollView,它会让滚动但是您会失去弹力(能够让红色容器向上推动上方框(ScrollView) ))所以我必须有一个弯曲。

p.s - 我只在Android上工作,我还没有在iPhone上测试过(我不介意那里的结果)

知道我错过了什么吗?为什么ScrollViewflex: 1时无效? 谢谢!

6 个答案:

答案 0 :(得分:14)

尝试在scrollView内容容器样式中使用flexGrow:1而不是flex:1,如下所示。

<ScrollView contentContainerStyle={{ flexGrow: 1, borderColor: 'green', borderWidth: 5 }}>
  <View style={styles.box1} />
  <View style={styles.box2} />
  <View style={styles.box1} />
</ScrollView>

https://snack.expo.io/HkkEVoh6Z

答案 1 :(得分:8)

我相信你的问题是你告诉ScrollView占用flex = 1的所有可用空间,但事实是ScrollView的工作方式不同。它会自动渲染其所有子节点,因此它与flex的工作方式不同。这是与具有更好性能的普通ListView或FlatList的区别。

我相信这个零食解决了这个问题:https://snack.expo.io/SkxN9GOT-

基本上,我正在获取设备的高度并根据(screenHeight - 红色框的当前高度)将ScrollView设置为固定高度。

答案 2 :(得分:1)

最好的方法是将ScrollView包裹在一个视图中并使用flex控制该视图,然后将滚动视图。

这是一个小例子

<View style={{flex: 1, flexDirection: 'column',}}>

          <View style={{flex:5, backgroundColor : 'green' }}>
            <ScrollView style={{margin:50, backgroundColor : 'pink' }}>

              <Text> Hello Scroll View </Text>
              <Text> Hello Scroll View </Text>
              <Text> Hello Scroll View </Text>
              <Text> Hello Scroll View </Text>
              <Text> Hello Scroll View </Text>
              <Text> Hello Scroll View </Text>

            </ScrollView>
          </View>

          <View style={{flex:1, backgroundColor : 'blue' }}>
              <Text> Hello Static View </Text>
          </View>

</View>

答案 3 :(得分:0)

尝试将contentContainerStyle替换为style。我相信这就是你的期望:https://snack.expo.io/S1CVrJYa-

答案 4 :(得分:0)

answer已经提供了如何操作。

但是这里有一个解释为什么你不能用你的方法做。 contentContainerStyle中给出的样式是

  

应用于包装所有子视图的滚动视图内容容器。

因此,当您将flex: 1应用于contentContainer时,其身高ScrollView的全高度flex: 1为其父View

你也可以模拟 -

  

能够让红色容器向上推动上方框

将父级添加到ScrollView并在父级

中应用样式
<View style={styles.root}>
  <View style={{ flex: 1, borderColor: 'green', borderWidth: 5 }}>
    <ScrollView>
      <View style={styles.box1} />
      <View style={styles.box2} />
      <View style={styles.box1} />
    </ScrollView>
  </View>
  <View style={{ height: this.state.height, backgroundColor: 'red' }}>
    <TouchableOpacity onPress={() => this.setState({ height: this.state.height + 10 })}>
      <Text>Click</Text>
    </TouchableOpacity>
  </View>
</View>

答案 5 :(得分:0)

尝试这一方法将100%解决您的问题

import React, { Component } from 'react';
import { AppRegistry, View,ScrollView } from 'react-native';

export default class AlignItemsBasics extends Component {
  render() {
    return (
      // Try setting `alignItems` to 'flex-start'
      // Try setting `justifyContent` to `flex-end`.
      // Try setting `flexDirection` to `row`.
      <View style={{ flex: 1,flexDirection: 'column' }}>
        <View style={{   height: 50, backgroundColor: 'powderblue'}} />
        <View style={{  flex: 1,  backgroundColor: 'skyblue'}} >
            <ScrollView>

<View style={{  flexDirection: 'column' , minHeight: 'fit-content'}} >
 <View style={{    height:150, backgroundColor: 'red'}} />
    <View style={{ minHeight: 'fit-content', backgroundColor: '#fe3222' }} />      

 <View style={{    height:150, backgroundColor: '#fff222'}} />
    <View style={{    height:150, backgroundColor: '#555222'}} />           
              </View>

  </ScrollView>
 </View>
      </View>
    );
  }
};

// skip this line if using Create React Native App
AppRegistry.registerComponent('AwesomeProject', () => AlignItemsBasics);