我正在尝试在ScrollView
上运行flex,只要ScrollView有flex: 1
,滚动内部就不起作用。
这里是世博会小提琴(你可以运行这个代码并玩)
https://snack.expo.io/SySerKNp-
请注意,如果您从flex: 1
中移除ScrollView
,它会让滚动但是您会失去弹力(能够让红色容器向上推动上方框(ScrollView) ))所以我必须有一个弯曲。
p.s - 我只在Android上工作,我还没有在iPhone上测试过(我不介意那里的结果)
知道我错过了什么吗?为什么ScrollView
在flex: 1
时无效?
谢谢!
答案 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>
答案 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);