2
votes

Manière appropriée de gérer différentes tailles d'écran dans React Native,

Au fur et à mesure que j'ai développé un natif de réaction en utilisant un appareil physique avec une taille d'écran de 6 pouces, il avait l'air génial et quand j'ai testé avec 5.5, c'est génial, car encore peu de composants ont été diffusés! Ensuite, j'ai essayé avec 4,3 pouces, omg la plupart des composants sont allés au-delà de l'écran. Ensuite, j'ai cherché sur Google et trouvé quelques paquets qui aident avec la taille de l'écran, cela a corrigé l'accessoire avec 5,5 mais toujours l'hélice persiste à 4,3 pouces!

J'ai converti la plupart de la largeur et de la hauteur en%, seul le remplissage est valorisé avec int.

Comment créer l'interface utilisateur, de manière réactive! Et l'un de mes plus grands doutes est que j'ai créé un composant View de haut niveau avec flex: 1 et largeur et hauteur avec la taille de l'écran. Même si, comment se fait-il que le monsieur va au-delà des mobiles à petit écran?

Comme il ne faut considérer la taille de l'écran que bcoz, j'ai déclaré la largeur et la hauteur de l'écran en récupérant la taille de l'écran. Donc, tous les autres composants devraient être à l'intérieur de ces valeurs, mais comment cela va-t-il au-delà?

Veuillez me guider avec ceci, merci d'avance!

Mise à jour : voici le code.

import React, { Component } from 'react';
import { View, Image, Dimensions } from 'react-native';
import { connect } from 'react-redux';
import { oneDayPlanSelected, monthlyPlanSelected } from '../../actions';
import { Text, Button, Card } from 'react-native-elements';
import {widthPercentageToDP as wp, heightPercentageToDP as hp} from 
'react- 
native-responsive-screen';

const windowW= Dimensions.get('window').width;
const windowH = Dimensions.get('window').height;

class PlanSelection extends Component {

onMonthlyPlanButtonPressed() {
    this.props.monthlyPlanSelected();
}

onOneDayPlanButtonPressed(){
    this.props.oneDayPlanSelected();
}

render () {

    const cowMilk = require('../../Images/cow_plan.png');
    const buffaloMilk = require('../../Images/buffalo_plan.png');

    return (
        <View style={styles.containerStyle}>

            <View style={styles.topContainerStyle}>
                <View style={styles.topBlueBoxContainer}>

                    <Text h4 style={styles.introTextStyle}>
                        Now, Choose how you wish to buy ? We have two 
plans.
                    </Text>
                    <View style={styles.imageContainerStyle}>
                        <Image 
                            source={ this.props.milkType === 'Cow Milk' ? 
cowMilk : buffaloMilk }
                            style={styles.topContainerImageStyle}
                        />
                        <View style={styles.choosePlanTextContainerStyle}>
                            <Text h4 style={styles.choosePlanTextStyle}>
                                Choose your plan.
                            </Text>
                        </View>
                    </View>

                </View>
            </View>

            <View style={{flexDirection:'row', justifyContent: 'space- 
evenly'}}>

                <View>
                    <Card
                    containerStyle={{borderRadius: 5, width: windowW/2.2 
}} 
                    >
                        <View style={{ alignItems: 'center' }}>
                            <View style={{flexDirection: 'row'}}>
                                <Text style= 
{styles.planNumberTextStyle}>1</Text>
                                <Text style={{ fontSize: 12, top: 40, 
fontWeight: 'bold' }}>Day</Text>
                            </View>
                            <View style={{ padding: 0 }}>
                            <Text style={styles.planDescpStyle}>Buy One 
day plan, by which we will deliver Cow Milk by Today.</Text>
                            </View>
                            <View style={{ padding: 0 }}>
                            <Text style={styles.planNameTextStyle}>One Day 
Plan</Text>
                            </View>
                        </View>
                        <Button
                        backgroundColor='#2980b9'
                        rightIcon={{name: 'arrow-forward'}}
                        title='Buy'
                        raised
                        onPress= 
{this.onOneDayPlanButtonPressed.bind(this)}
                        />
                    </Card>
                </View>

                <View>
                    <Card
                    containerStyle={{borderRadius: 5,  width: windowW/2.2  
}} 
                    >
                        <View style={{ alignItems: 'center' }}>
                            <View style={{flexDirection: 'row'}}>
                                <Text style= 
{styles.planNumberTextStyle}>30</Text>
                                <Text style={{ fontSize: 12, top: 40, 
fontWeight: 'bold' }}>Day's</Text>
                            </View>
                            <View style={{ padding: 0 }}>
                                <Text style={styles.planDescpStyle}>We 
have various monthly plans, Check In for more info</Text>
                            </View>
                            <View style={{ padding: 0 }}>
                                <Text style= 
{styles.planNameTextStyle}>Monthly Plan</Text>
                            </View>
                        </View>
                        <Button
                        backgroundColor='#2980b9'
                        rightIcon={{name: 'arrow-forward'}}
                        title='Buy'
                        raised
                        onPress= 
{this.onMonthlyPlanButtonPressed.bind(this)}
                        />
                    </Card>
                </View>

            </View>
            <View style={styles.noteContainerStyle}>
                <Text style={styles.noteTextStyle}>We are excited ! Kindly 
select any one plan, and note that Monthly plan has various sub plans. For 
more info kindly choose the plan. </Text>
            </View>

        </View>
    );
   }
}

 const styles = {

containerStyle: {
    flex: 1,
    height: windowH,
    width: windowW, 
},
topBlueBoxContainer:{
    backgroundColor: '#f0ffff',
    height: windowH/1.7,
    justifyContent: 'space-evenly',
},
imageContainerStyle: {
    alignSelf: 'center'
},
topContainerImageStyle: {
    resizeMode: 'contain',
    height: windowH/3
},
introTextStyle: {
    fontSize: 20,
    paddingBottom: windowH/28,
    paddingLeft: windowW/8,
},
choosePlanTextStyle: {
    fontSize: 22
},
choosePlanTextContainerStyle:{
    alignSelf: 'center',
    padding: 15
},
planNameTextStyle: {
    fontSize: 16,
    fontWeight: 'bold'
},
planNumberTextStyle: {
    fontSize: 50,
    fontWeight: 'bold',
    color: '#37BBE1'
},
planDescpStyle: {
    fontSize: 13,
    flexWrap: 'wrap',
    textAlign: 'center'

},
noteTextStyle: {
    fontSize: 10,
    color: '#b2bec3'
},
noteContainerStyle: {
    paddingTop: windowH/30,
    paddingLeft: windowW/25,
    paddingRight: windowW/10,
    bottom: windowW/22
}

};

const mapStateToProps = state => {
return {
    milkType: state.order.milktype
};
};

export default connect(mapStateToProps,  
{oneDayPlanSelected,monthlyPlanSelected})(PlanSelection);

Interface utilisateur en écran de 4,3 pouces:

entrez la description de l'image ici

Interface utilisateur dans un écran de 6 pouces:

 entrez la description de l'image ici

Vérifiez le bas de l'écran, les composants des boutons et quelques mots ont été débordés. Et j'utilise des éléments natifs de réaction pour le bouton et la carte, est-ce à cause de cela? Une idée et une suggestion?


0 commentaires

5 Réponses :


1
votes

Vous ne devez pas utiliser% pour fournir la largeur et la hauteur des composants à la place, vous devez utiliser Dimensions pour obtenir la largeur et la hauteur de l'écran, puis ajuster le style du composant en conséquence, comme marginTop, marginBottom, etc.

import {StyleSheet, Dimensions} from 'react-native';

OU,

vous pouvez faire quelque chose comme ceci

const windowW= Dimensions.get('window').width
const windowH = Dimensions.get('window').height

et l'utiliser comme dims: {height: windowH / 2, width: windowW}

De plus, vous pouvez ajuster la largeur et la hauteur en utilisant windowW / 2-30 etc.

Assurez-vous d'importer les dimensions en utilisant-

const { width, height } = Dimensions.get('window');


18 commentaires

Alors en utilisant ce genre de dimensions? Il sera automatiquement redimensionné en fonction de la taille de l'écran? Et nous devrions l'utiliser pour tous les composants qui nécessitent une hauteur et une largeur, n'est-ce pas?


essayez d'abord de l'utiliser pour le composant parent.


puis ajustez les composants enfants en conséquence. Faites-moi savoir si vous êtes coincé quelque part.


J'ai essayé, mais je n'ai trouvé aucune différence. Cela se produit-il en raison de la taille de la police? avons-nous besoin de rendre la police également réactive en utilisant rem ou quelque chose?


essayez d'utiliser la largeur du texte dans lequel vous affichez la police avec la taille de la police


vous voulez dire que nous devrions garder la taille et la largeur de la police j'ai essayé si le texte est long, alors il rétrécit!


essayez la même chose avec les rembourrages


qu'est-ce que vous entendez par une configuration flexible correcte? J'ai gardé un conteneur de niveau supérieur avec flex: 1, et j'ai changé les sous-composants avec des alignements respectifs en utilisant padding, margin, top, bottom, left! est-ce correct ?


oui, je le sais et aussi j'ai implémenté Flex Direction là où c'est nécessaire


Vérifiez la direction de flexion dans le composant parent


oh oui et si vous souhaitez limiter votre application en mode portrait ou en mode paysage, vous pouvez le faire en modifiant le fichier manifeste Android.


oui, j'ai déjà fait les changements pour garder le portrait comme mode par défaut


Aujourd'hui, j'ai utilisé la bibliothèque appelée react-native-size-issues pour mettre à l'échelle les valeurs en fonction de la taille de l'écran. Donc, le code modifié inclura ces valeurs. Est-il acceptable de publier le code ici? comment envoyer le code!


Annulez le code et publiez le code précédent ici après avoir cliqué sur Modifier dans votre question


@Arvindh J'ai vérifié la moitié de votre code et d'abord supprimer la largeur et la hauteur du containerStyle et le laisser flex: 1 uniquement et de plus si vous utilisez headerLeft en haut de l'écran, utilisez react navigation createstacknavigator qui créera l'interface utilisateur sensible à tous les écrans seuls


Ya, en utilisant la navigation de réaction uniquement avec l'en-tête activé. Et j'ai essayé de supprimer la largeur et la hauteur! Je pense que le problème est que les éléments natifs réagissent, prévoyant de passer à la base native


@Arvindh des progrès avec nativebase? poster n'importe quel lien de capture d'écran dans les commentaires ici


@Arvindh me fait savoir si vous obtenez des progrès avec nativebase car je prévoyais également de travailler sur nativebase



0
votes

essayez d'utiliser les propriétés flex (< code> flex , flexDirection ) et alignement avec alignItems & jsutifyContent avec les marges et les rembourrages souhaités.


1 commentaires

Comme auparavant, je faisais les dessins en utilisant uniquement ceux-ci!



0
votes

Bien que les dimensions comme Harshit mentionnées soient une option, je ne l'aime pas, car lorsque l'utilisateur change de direction de paysage en portrait par exemple, les valeurs ne sont pas mises à jour en conséquence et vous avez une interface utilisateur laide.
Je préfère le configurer avec flex et m'assurer que les vues avec beaucoup de contenu sont des ScrollViews (pour les petits appareils).
Aussi pour l'espace horizontal, si c'est indispensable, vous pouvez définir comme 320-340 dp fixe pour les mobiles, et 820-840 dp fixe pour les tablettes sur la vue conteneur.


2 commentaires

Dans mon cas, je limite mon application au mode portrait uniquement. Alors ça marche pour moi.


J'ai demandé à l'interlocuteur d'afficher le code, inspectons où il se trompe.



0
votes

Ma méthode consiste à utiliser une combinaison de flex [pour remplir ce que je veux peu importe la taille], avec la propriété aspectRatio [pour avoir le même rapport hauteur / largeur dans chaque écran quelle que soit la taille], et la bibliothèque react-native -size-important [pour avoir les unités de taille mises à l'échelle en fonction de l'écran], jusqu'à présent, l'interface utilisateur est sensible aux smartphones et tablettes c :. Oh, et jamais, JAMAIS je n'utilise de valeurs absolues, ite fait que l'interface utilisateur, comme vous l'avez dit, déborde [xd].

Une autre astuce intéressante est simplement de ne pas utiliser la propriété height ou width, car ils s'adaptent à leurs enfants. J'ai une barre, avec largeur: '100%' , et à l'intérieur j'ai un composant de texte avec fontSize: averageScale (30) [react-native-size-topics] , ainsi que padding: moderScale (5) . Cette configuration simple rend la même barre, avec une interface utilisateur réactive [c'est normal sur les petits écrans et plus grand sur les grands écrans] 7u7


3 commentaires

et je peux même ignorer la largeur: «100%», car si laissé seul, le texte remplit toute la largeur disponible. Il s'agit simplement de savoir comment les combiner et de savoir comment se comporte chaque propriété de composant / layout facebook.github.io/react-native/docs/layout-props


En fait, j'ai converti toutes les valeurs absolues en valeurs de réaction natives, telles que l'échelle, l'échelle verticale et l'échelle modérée. Mais, je reçois toujours un débordement avec les dimensions verticales, car seuls les motifs inférieurs débordent que l'écran d'un téléphone de petite taille!


Quelle partie du composant déborde?, Le composant entier? , veuillez poster une capture d'écran dans deux tailles d'écran différentes, cela aiderait beaucoup.



0
votes

Ok ajout de la réponse (désolé pour le retard) J'ai trouvé et corrigé quelques problèmes avec votre style

Dans votre vue racine

containerStyle: {
    flex: 1, //This already tells that it should fill all space available, no need for width or height
    //height: windowH,
    //width: windowW, 
},

topContainerStyle n'existe pas dans votre code donc je n'en ai aucune idée

MISE À JOUR 2 heures plus tard ...

J'ai reconstruit toute l'interface utilisateur uniquement pour montrer comment flex doit être utilisé, gardez à l'esprit que j'ai coupé du texte, c'est parce que si vous avez besoin que le texte soit montré, il doit être court, ou être enveloppé dans un scrollview. J'ai remplacé la carte, car elle posait des problèmes de flex, il suffit de styliser une vue, de lui donner du rembourrage et vous avez une carte personnalisée.

Je voulais utiliser react-native-size-topics mais j'ai passé trop de temps là-dedans, cependant, un conseil rapide est que si vous pouvez faire pivoter le téléphone et que l'interface utilisateur n'est pas complètement poubelle, vous avez une excellente interface utilisateur! c:

https://snack.expo.io/rygco3J74 p>

Vous pouvez même implémenter votre propre bouton ... Personnellement, je n'utilise pas les éléments react-native-elements parce que j'aime faire les choses moi-même;) consultez l'expo et essayez de faire pivoter le téléphone, vous pouvez même ajouter un auditeur à la rotation et modifiez la taille de la police en fonction de la rotation.


1 commentaires

Merci pour cela et je l'apprécie, je vérifierai et je vous recontacterai!