J'essaie d'afficher une liste d'images dans une vue à défilement. La largeur doit être de 100%, tandis que la hauteur doit être automatique, en conservant les proportions.
Les recherches que j'ai effectuées ont mis en évidence diverses solutions qui donnent un style de fond plein écran.
const styles = StyleSheet.create({
image: {
width: null,
height: 300,
resizeMode: 'cover'
}
});
<ScrollView style={{flex: 1}}>
<Image style={styles.image} source={require('../../../images/collection-imag1.png')}/>
<Image style={styles.image} source={require('../../../images/collection-imag2.png')}/>
</ScrollView>
J'ai essayé diverses combinaisons de largeur: null, height: null, flex: 1, alignSelf, etc. La solution ci-dessus fonctionne presque, sauf que la hauteur n'est pas dynamique. Certaines parties de l'image ne sont pas visibles.
"resizeMode"
n'est pas une propriété de style. Devrait être déplacé dans la variable Props
du composant Image, comme ci-dessous.
const win = Dimensions.get('window');
const styles = StyleSheet.create({
image: {
flex: 1,
alignSelf: 'stretch',
width: win.width,
height: win.height,
}
});
...
<Image
style={styles.image}
resizeMode={'contain'} /* <= changed */
source={require('../../../images/collection-imag2.png')} />
...
La hauteur de l'image ne deviendra pas automatiquement car le composant Image est requis à la fois en largeur et en hauteur dans style props
. Vous devez donc calculer vous-même en utilisant getSize () method et vous pouvez voir dans cette réponse .
Il y a beaucoup de bibliothèques open source utiles, la liste est affichée ci-dessous.
Donc, après avoir réfléchi pendant un moment, j’ai réussi à atteindre la hauteur: auto dans une image réactive-native . Vous devez connaître les dimensions de votre image pour que ce piratage fonctionne. Ouvrez simplement votre image dans n’importe quelle visionneuse et vous obtiendrez les dimensions de votre image dans les informations de fichier .pour référence la taille de l’image que j’ai utilisée est 541 x 362
Première importation de dimensions de react-native
import { Dimensions } from 'react-native';
alors vous devez obtenir les dimensions de la fenêtre
const win = Dimensions.get('window');
Calculez maintenant le ratio comme
const ratio = win.width/541; //541 is actual image width
maintenant le style ajouter à votre image
imageStyle: {
width: win.width,
height: 362 * ratio, //362 is actual height of image
}
Vous devez toujours définir la largeur et la hauteur d'une Image
. Il ne va pas automatiquement dimensionner les choses pour vous. Le React Native docs le dit .
Vous devez mesurer la hauteur totale de ScrollView
à l'aide de onLayout
et définir la hauteur de Image
s en fonction de celle-ci. Si vous utilisez resizeMode
sur cover
, les proportions de votre Image
seront conservées, mais elles seront évidemment coupées si leur taille est supérieure au conteneur.
Pour les tags d'image, vous pouvez utiliser ce type de style, cela a fonctionné pour moi:
imageStyle: {
width: Dimensions.get('window').width - 23,
resizeMode: "contain",
height: 211,
},