Ich versuche, flex auf einem ScrollView
auszuführen, und solange die ScrollView flex: 1
hat, funktioniert der scroll in nicht. Hier ist die Expo-Geige (mit der Sie diesen Code ausführen und damit spielen können) https://snack.expo.io/SySerKNp-
wenn Sie flex: 1
aus dem ScrollView
entfernen, wird das Scrollen zwar nicht ausgeführt, aber Sie verlieren die Flexkraft (die Fähigkeit, den roten Container nach unten zu drücken.
p.s - Ich arbeite nur mit Android und habe es nicht auf dem iPhone getestet (ich habe nichts dagegen)
irgendeine ahnung was fehlt mir? Warum funktioniert ScrollView
nicht richtig, wenn es einen flex: 1
hat? Danke!
Ich glaube, Ihr Problem ist, dass Sie dem ScrollView sagen, dass es mit flex = 1 den gesamten verfügbaren Speicherplatz belegen soll. ScrollView funktioniert jedoch anders. Alle untergeordneten Elemente werden automatisch gerendert, sodass sie mit flex anders funktionieren. Das ist der Unterschied zu einer normalen ListView oder FlatList, die eine bessere Leistung aufweist.
Ich glaube, dieser Snack löst dieses Problem: https://snack.expo.io/SkxN9GOT-
Grundsätzlich erhalte ich die Höhe des Geräts und setze die ScrollView auf eine feste Höhe, basierend auf (screenHeight - die aktuelle Höhe der roten Box).
Versuchen Sie es mit flexGrow: 1 anstelle von flex: 1 im Inhalt des Scroll-Container wie folgt.
<ScrollView contentContainerStyle={{ flexGrow: 1, borderColor: 'green', borderWidth: 5 }}>
<View style={styles.box1} />
<View style={styles.box2} />
<View style={styles.box1} />
</ScrollView>
Das Beste, was Sie tun können, ist, Ihre ScrollView in eine Ansicht zu packen und diese Ansicht mit Flex zu steuern.
Dies ist ein kleines Beispiel
<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>
Diese Antwort wurde bereits zur Verfügung gestellt.
Aber hier ist eine Erklärung, warum Sie Ihre Methode nicht verwenden können. Die in contentContainerStyle
angegebenen Stile sind
wird auf den Inhaltscontainer für die Bildlaufansicht angewendet, der alle untergeordneten Ansichten einschließt.
Wenn Sie also flex: 1
auf contentContainer
anwenden, wird die volle Höhe von ScrollView
verwendet, deren Höhe ebenfalls flex: 1
als übergeordnete View
ist.
Sie können auch simulieren -
die Fähigkeit, den roten Behälter herunterzulassen, um den oberen Kasten nach oben zu drücken
durch Hinzufügen eines übergeordneten Elements zu ScrollView
und Anwenden des Stils im übergeordneten Element
<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>
Versuchen Sie, contentContainerStyle
durch style
zu ersetzen. Ich glaube, das erwarten Sie: https://snack.expo.io/S1CVrJYa-
Probieren Sie es aus, es wird Ihr Problem zu 100% lösen
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);