【问题标题】:Cannot scroll to bottom of ScrollView in React Native在 React Native 中无法滚动到 ScrollView 的底部
【发布时间】:2017-12-21 07:28:56
【问题描述】:

我有一个使用ScrollView 的非常简单的示例,但我似乎无法滚动到底部。

这个例子是完全基本的,我没有做任何特别的事情,但最后一项永远不会完全可见。

Expo Code

 import React, { Component } from "react";
 import { Text, View, ScrollView, StyleSheet } from "react-native";
 import { Constants } from "expo";

 const data = Array.from({ length: 20 }).map((_, i) => i + 1);

 export default class App extends Component {
  render() {
    return (
        <ScrollView style={styles.container}>
            {data.map(d => (
                <View style={styles.view}>
                    <Text style={styles.text}>{d}</Text>
                </View>
            ))}
        </ScrollView>
      );
    }
  }

const styles = StyleSheet.create({
  container: {
     paddingTop: Constants.statusBarHeight
  },
  text: {
    fontWeight: "bold",
    color: "#fff",
    textAlign: "center",
    fontSize: 28
},
view: {
    padding: 10,
    backgroundColor: "#018bbc"
  }
 });

这是输出:

【问题讨论】:

  • flex: 1 添加到容器中应该可以解决问题
  • @AakashSigdel 我有一个类似的用例。 flex: 1 没用。我仍在使用各种道具,但到目前为止,每当我滚动到底部时,视图都会反弹,阻止我选择最后一个项目,这恰好是一个按钮。
  • 你应该改变正确的答案

标签: javascript reactjs react-native scrollview


【解决方案1】:

将填充样式应用于“contentContainerStyle”属性,而不是 ScrollView 的“样式”属性。

【讨论】:

    【解决方案2】:

    我通过将 Scrollview 的 contentInset 底部属性设置为一个足以让我看到我的内容的最底部部分(在我的例子中是一个按钮)的值来解决问题。

    例子:

    <ScrollView
      contentInset={{bottom: 80}}>
      {{ content }}
    </ScrollView>
    

    【讨论】:

    • 这是我需要的。我的滚动视图位于模态框内,并使用 contentContainerStyle 作为其样式,但它们都没有真正的帮助。除了这个。谢谢!
    • 很高兴它有帮助。 :)
    • 请记住,这仅适用于 iOS。 Source
    【解决方案3】:

    flexGrow: 1contentContainerStyle 设置为ScrollView

    contentContainerStyle={{ flexGrow: 1 }}
    

    【讨论】:

    • 这解决了我的问题
    【解决方案4】:

    我的应用程序中只有一个ScrollView,它运行良好。然后我在顶部添加了一个标题组件,我的ScrollView 的底部不再可见。我尝试了一切,但没有任何效果。直到我在尝试所有疯狂的事情一小时后找到了解决方案,这就是它。我通过将paddingBottom 作为contentContainerStyle 添加到我的ScrollView 来解决此问题。

    <ScrollView contentContainerStyle={{paddingBottom: 60}} >
        {this.renderItems()}
    </ScrollView>
    

    【讨论】:

    • 这似乎非常有效。随着时间的推移,您是否遇到过任何问题?
    • 幸运的是,还没有。 :)
    【解决方案5】:

    为 ScrollView 添加高度样式。

    height:'100%', width:'100%'
    

    【讨论】:

      【解决方案6】:

      我遇到了这个问题并修复了它。要解决它: flex:1 表示“将其扩展到其父级大小”,如果父级的高度为 0,它将不起作用 flex:-1 表示“将其缩小以适合其子级大小”,如果子级高度设置为 flex:1(取决于父级)-> 它不起作用-> 你问我?我问你回来。环形。 滚动视图中有两个视图 -> 一个 {flex:1} 外部视图包裹了一个 {flex:-1} 内部视图。当内部视图高于外部视图时,即发生滚动。 这也意味着外部视图高度取决于滚动视图父级,内部视图取决于子级。如果您不能为其外部视图指定高度,则外部视图将变为 0 高度。您不能使用高度为 0 的外部视图滚动内部视图,一旦您的手指松开,它将始终弹回原点位置。 用&lt;View style={{flex:1}}&gt; 包装它可能会或可能不会解决您的问题,因为这意味着滚动视图的父级会自行扩展以适应其父级,然后高度取决于它的父级。 (您的滚动视图的祖父)。所以如果你的祖父母没有定义身高,它就会失败。

      下面的例子不起作用

      <View style={{height:300,width:200}}>
      <View> //<-this break
      <View {{flex:1}}>
      <ScrollView>{contents}</ScrollView>
      </View>
      </View>
      </View>
      

      这项工作:

       var {Windowheight, width} = Dimensions.get('window');
      <View style={{height:Windowheight}}>
      <View style={{flex:1}}>
      <ScrollView>{contents}</ScrollView>
      <View>
      </View>
      

      这也有效:

       var {windowHeight, windowWidth} = Dimensions.get('window');
      <View style={{height:windowHeight}}>
      <Toolbar or other component with fixed height>
      <ScrollView style={{flex:1}}>{contents}</ScrollView>
      <Footer or other component with fixed height>
      </View>
      

      结论,请确保您的滚动视图高度可以从外部和内部确定。如果发生奇怪的事情,追踪祖先直到你找到一个高度,或者只是在它的可追踪祖先中定义一个实体而不依赖 flex:1 一些第三方组件用 &lt;View&gt; 包装东西,这会破坏东西。

      【讨论】:

      • 谢谢!您终于向我解释了 ScrollView 的实际工作原理。阅读您的评论后,我能够在 5 分钟内修复我的 ScrollView。
      【解决方案7】:

      修改您的render() 方法并将ScrollView 包装在View 容器中,并将paddingTop 设置为该View 容器:

      render() {
          return (
              <View style={ styles.container}>
                  <ScrollView >
                      {data.map(d => <View style={styles.view}><Text style={styles.text}>{d}</Text></View>)}
                  </ScrollView>
              </View>
          );
      }
      

      【讨论】:

      • 起初,这似乎是合乎逻辑的。然而,我在我的代码中实现了它,但没有明显的效果。我的ScrollView 底部有一个按钮无法访问,因为在释放点击后视图会弹回顶部。我希望当视图被释放时滚动保持不变。
      猜你喜欢
      • 2021-05-05
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2013-02-14
      • 1970-01-01
      • 2022-12-22
      • 2020-02-11
      相关资源
      最近更新 更多