Правильный способ справиться с различными размерами экрана в реакции родного, - PullRequest
0 голосов
/ 12 января 2019

Поскольку я разработал стандартную версию с использованием физического устройства с размером экрана 6 дюймов, он выглядел великолепно, а затем, когда я тестировал с 5.5, это было здорово, поскольку еще немного компонентов получили распространение! Тогда я попробовал с 4,3 дюйма, боже мой, большинство компонентов вышли за пределы экрана. Затем я гуглил и нашел несколько пакетов, которые помогают с размером экрана, он исправил пропелку с 5,5, но все равно пропорка сохраняется на 4,3 дюйма!

Я перевел большую часть ширины и высоты в%, только значение padding имеет значение int.

Как сделать интерфейс, отзывчиво! И одно из моих главных сомнений в том, что я создал компонент View верхнего уровня с помощью flex: 1, ширины и высоты с размером экрана. Несмотря на то, почему сэр выходит за рамки в небольших мобильных экранах?

Поскольку он должен учитывать размер экрана только bcoz, я объявил ширину и высоту экрана, выбирая размер экрана. Таким образом, все остальные компоненты должны быть внутри этих значений, но как это выходит за рамки?

Пожалуйста, ведите меня с этим, спасибо заранее!

Обновление : Вот код.

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);

Пользовательский интерфейс на 4,3-дюймовом экране:

enter image description here

пользовательский интерфейс на 6-дюймовом экране:

enter image description here

Проверьте нижнюю часть экрана, компоненты кнопок и несколько слов переполнены. И я использовал реагировать нативные элементы для кнопки и карты, это из-за этого? Любая идея и предложение?

Ответы [ 5 ]

0 голосов
/ 18 января 2019

ОК, добавив ответ (извините за задержку) Я нашел и исправил некоторые проблемы с вашим стилем

В вашем корневом представлении

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

topContainerStyle не существует в вашем коде, поэтому я понятия не имею

UPDATE 2 часа спустя ...

Я перестроил весь пользовательский интерфейс только для того, чтобы продемонстрировать, как следует использовать flex, имейте в виду, что я вырезал какой-то текст, потому что если вам нужен текст, который нужно показать, он должен быть коротким или быть обернутым в прокрутка. Я заменил карту, так как она давала некоторые проблемы с flex, просто стилизовал вид, добавил немного отступов, и у вас есть пользовательская карта.

Я хотел использовать реактивные носители, но я потратил слишком много времени на это, однако, быстрый совет: если вы можете повернуть телефон, и пользовательский интерфейс не является полностью мусорным, у вас есть отличный интерфейс! с:

https://snack.expo.io/rygco3J74

Вы даже можете реализовать свою собственную кнопку ... я лично не использую реагирующие нативные элементы, потому что мне нравится делать все самостоятельно;) проверить выставку и попробовать повернуть телефон, вы даже можете добавить слушателя к вращение и изменить размер шрифта в соответствии с вращением.

0 голосов
/ 12 января 2019

Мой способ состоит в том, чтобы использовать комбинацию flex [чтобы заполнить то, что я хочу, независимо от размера], со свойством aspectRatio [иметь одинаковое соотношение сторон на каждом экране независимо от размера], а библиотека реагирует на нативную. -size-значения [иметь размеры, измеренные в соответствии с экраном], пока пользовательский интерфейс реагирует на смартфоны и планшеты c :. О, и никогда, НИКОГДА я не использую абсолютные значения, поэтому пользователь делает интерфейс, как вы сказали, переполнением [xd].

Еще одна изящная уловка - просто не использовать свойство высоты или ширины, поскольку они приспособлены для своих детей. У меня есть строка с width:'100%', а внутри у меня есть текстовый компонент с fontSize:moderateScale(30) [реакция-родной-размер-вопросы], а также padding:moderateScale(5). Эта простая настройка отображает ту же панель с отзывчивым пользовательским интерфейсом [это нормально на маленьких экранах и больше на больших экранах] 7u7

0 голосов
/ 12 января 2019

попробуйте использовать flex свойства (flex, flexDirection) и выровнять по alignItems & jsutifyContent вместе с желаемыми полями и отступы.

0 голосов
/ 12 января 2019

Хотя размеры, подобные упомянутому Harshit, являются опцией, мне они не нравятся, потому что когда пользователь меняет направление, например, с пейзажа на портрет, значения не обновляются соответствующим образом, и у вас появляется ужасный пользовательский интерфейс.
Я предпочитаю настроить его с помощью flex и убедиться, что представления с большим количеством контента являются ScrollViews (для небольших устройств).
Также для горизонтального пространства, если это необходимо, вы можете установить как 320-340 фиксированный дп для мобильных телефонов, так и 820-840 фиксированный дп для планшетов при просмотре контейнера.

0 голосов
/ 12 января 2019

Вы не должны использовать% для предоставления ширины и высоты для компонентов, вместо этого вы должны использовать Размеры, чтобы получить ширину и высоту экрана, а затем соответствующим образом настроить стиль компонента, например marginTop, marginBottom и т. Д.

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

OR

вы можете сделать что-то вроде этого

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

и используйте это как dims: {height: windowH / 2, width: windowW}

Кроме того, вы можете настроить ширину и высоту, используя windowW / 2-30 и т. Д.

Обязательно импортируйте Размеры, используя-

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