【问题标题】:ScrollView with flex 1 makes it un-scrollable带有 flex 1 的 ScrollView 使其不可滚动
【发布时间】:2018-03-30 00:43:16
【问题描述】:

我正在尝试在 ScrollView 上运行 flex,只要 ScrollView 有 flex: 1里面的滚动就不起作用。 这是博览会小提琴(您可以运行此代码并使用) https://snack.expo.io/SySerKNp-

请注意,如果您从ScrollView 中删除flex: 1,它确实可以滚动,但是您会失去弹性功能(让红色容器向下推上框(ScrollView)的能力)所以我那里必须有弹性。

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

知道我错过了什么吗?为什么 ScrollViewflex: 1 时不能正常工作? 谢谢!

【问题讨论】:

  • 如何在snack上运行代码? ...也不确定,尽管我认为您需要将 ScrollView 包装在 View
  • 您是否尝试将flex: 1 添加到最外层的View
  • @LGSon 是的,我试过了,它仍然无法正常工作,无论哪种方式我都会失去弹性或滚动。
  • 你为什么不能这样做? ...可能需要解决此问题,例如:snack.expo.io/HkNEysN6-
  • @Danny 这是因为 ScrollView 内部的工作方式。请解释你想要完成什么。您想在红框上方显示一个框列表吗?什么是现在不工作的东西? (注意:如果我点击红色框,上次博览会没有任何反应)

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


【解决方案1】:

最好的办法是将您的 ScrollView 包装在一个 View 中并使用 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>

【讨论】:

    【解决方案2】:

    试试这个,它会 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);
    

    【讨论】:

      【解决方案3】:

      尝试在 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

      【讨论】:

      • 这就是答案。我能够用这个解决同样的问题。阅读有关 flex-grow 的更多信息,您就会明白这一点。
      • 这是首席
      • 这可以节省一天的时间!
      • 这应该是公认的答案。完美运行,避免额外的视图和不必要的逻辑
      【解决方案4】:

      这个answer 已经提供了如何操作。

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

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

      因此,当您将flex: 1 应用于contentContainer 时,它会将高度也是flex: 1ScrollView 的全高作为其父级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】:

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

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

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

        【讨论】:

        • 做得很好。我本来打算采取同样的方法,但你打败了我。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        相关资源
        最近更新 更多