React Native Flexbox에서 100 % 너비


203

이미 여러 flexbox 튜토리얼을 읽었지만 여전히이 간단한 작업을 수행 할 수는 없습니다.

빨간색 상자를 100 % 너비로 만들려면 어떻게해야합니까?

여기에 이미지 설명을 입력하십시오

암호:

  <View style={styles.container}>
    <Text style={styles.welcome}>
      Welcome to React Natives
    </Text>
    <Text style={styles.line1}>
      line1
    </Text>
    <Text style={styles.instructions}>
      Press Cmd+R to reload,{'\n'}
      Cmd+D or shake for dev menu
    </Text>
  </View>

스타일:

container: {
  flex: 1,
  justifyContent: 'center',
  alignItems: 'center',
  backgroundColor: '#F5FCFF',
  borderWidth: 1,
  flexDirection: 'column',
},
welcome: {
  fontSize: 20,
  textAlign: 'center',
  margin: 10,
  borderWidth: 1,
},
line1: {
    backgroundColor: '#FDD7E4',
},
instructions: {
  textAlign: 'center',
  color: '#333333',
  marginBottom: 5,
  borderWidth: 1,
},

감사합니다!

업데이트 1 : Nishanth Shankar의 제안, 래퍼 flex : 1에 flex : 1 추가 : flexDirection : 'row'

산출:

여기에 이미지 설명을 입력하십시오

암호:

  <View style={styles.container}>
    <View style={{flex:1}}>
      <Text style={styles.welcome}>
        Welcome to React Natives
      </Text>
    </View>
    <View style={{flex:1}}>
      <Text style={styles.line1}>
        line1
      </Text>
    </View>
    <View style={{flex:1}}>
      <Text style={styles.instructions}>
        Press Cmd+R to reload,{'\n'}
        Cmd+D or shake for dev menu
      </Text>
    </View>
  </View>

  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
    borderWidth: 1,
    flexDirection: 'row',
    flexWrap: 'wrap',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
    borderWidth: 1,
  },
  line1: {
      backgroundColor: '#FDD7E4',
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
    borderWidth: 1,
  },

답변:


414

alignSelf: "stretch"상품의 스타일 시트에 추가 하기 만하면 됩니다.

line1: {
    backgroundColor: '#FDD7E4',
    alignSelf: 'stretch',
    textAlign: 'center',
},

9
링크가 끊어졌습니다.
루카스 크 누스

2
alignSelf stretch를 사용하면 Android에 문제가 있습니다. '절대'위치의 이미지가 있었고이 경우 'stretch'를 사용하더라도 이러한 상자는 포함 된 요소의 가장자리에 채워집니다. Dimensions.get ( 'window'). width는 필자의 경우 iOS와 Android에서 모두 작동했습니다.
st_bk

이 한 가지 방법으로 모든 '전체 너비'문제를 해결했습니다. snack.expo.io/S1PWQqkcZ
webdevinci

1
width: "100%"작동 해야하는 것처럼 보이지만 작동하지 않습니다. 나는 언제 alignSelf: "stretch"작동하는지 이해할 수 없다고 생각 합니다 width: "100%". @Corentin 어떤 아이디어? 고마워!
Joel

4
@st_bk는 생명의 은인이었습니다! 그러나, 나는 당신이 절대적으로 포지셔닝하고 스트레칭 해야하는 이벤트에 대한 더 나은 솔루션을 발견했습니다.position: absolute, top: 0, bottom: 0, left: 0, right: 0
lance.dolan

119

치수를 사용해야합니다

먼저 차원을 정의하십시오.

import { Dimensions } from "react-native";

var width = Dimensions.get('window').width; //full width
var height = Dimensions.get('window').height; //full height

그런 다음 line1아래와 같이 스타일을 변경하십시오 .

line1: {
    backgroundColor: '#FDD7E4',
    width: width,
},

3
Melx Mucuk! alignSelf : Corentin S.가 제안한 "스트레치"는 가장 쉽고 간단하므로 그 대답을 받아 들였습니다. 그러나 Dimensions를 사용하면 레이아웃을 둘러 볼 수있는 새로운 방법이 생깁니다. 경우에 따라 프로그래밍 방식으로 항목을 조정할 수 있습니다. 감사합니다!
franfran

1
@Melih 내 안드로이드 장치에서 반환 된 너비가 잘못되었습니다. 올바른 너비는 720 픽셀이지만 360 픽셀이 반환됩니다.
peacepassion

4
@peacepassion, 장치 dpi가 2 배로 조정되었으므로 360을 얻었습니다. 시도하십시오 Dimensions.get('window').scale-귀하의 경우 2를 반환해야합니다.
matusalem

귀하의 답변에 감사드립니다. 배경이있는 컨테이너를 다루고 있으며 귀하의 제안은 완벽하게 맞습니다.
clarenswd

7
장치가 회전하면 작동하지 않습니다. 적응 형 레이아웃을 사용하는 것이 좋습니다.
laynemoseley

26

편집 :

중심 텍스트 만 구부리려면 다른 접근법을 취할 수 있습니다- 다른 뷰를 구부리지 마십시오.

  • flexDirection을 '열'로 유지하십시오
  • 을 제거 alignItems : 'center'컨테이너에서
  • 조정 alignSelf:'center'하고 싶지 않은 텍스트 뷰에 추가

Text 구성 요소를 View 구성 요소로 감싸고 View에 flex를 1로 지정할 수 있습니다.

플렉스는 다음을 제공합니다.

flexDirection:'row'in styles.container 인 경우 너비 100 %

flexDirection:'column'in styles.container 인 경우 높이 100 %


예, 너비가 100 %가되도록 flexDirection : 'row'및 flex : 1을 설정하려고했습니다. 그러나 구성 요소는 모두 인라인이므로 다음 행으로 이동할 수 없습니다. 심지어는 flexWrap를 사용 : '랩'
franfran

새로운 프랜 프랜트 방법으로 운이 좋습니까?
Nishanth Shankar

Corentin S.가 제안한 alignSelf : 'stretch'.
franfran

8

여기 있습니다 :

아래에 따라 line1 스타일을 변경하십시오.

line1: {
    backgroundColor: '#FDD7E4',
    width:'100%',
    alignSelf:'center'
}

6

javascript를 사용하여 너비와 높이를 가져 와서 View 스타일로 추가하십시오. 전체 너비와 높이를 얻으려면 https://facebook.github.io/react-native/docs/dimensions.html을 사용 Dimensions.get('window').width 하십시오.

getSize() {
    return {
        width: Dimensions.get('window').width, 
        height: Dimensions.get('window').height
    }
}

그리고,

<View style={[styles.overlay, this.getSize()]}>

우, 이거 좋아. 아마도 가장 좋은 해결책은 아니지만 내 문제를 해결했습니다. 그것은 일반적으로 꽤 깔끔한 기능이라는 것은 말할 것도 없습니다.
Kevin Østerkilde

5

먼저 차원 구성 요소를 추가하십시오.

import { AppRegistry, Text, View,Dimensions } from 'react-native';

둘째로 변수를 정의하십시오.

var height = Dimensions.get('window').height;
var width = Dimensions.get('window').width;

셋째로 스타일 시트에 넣으십시오.

textOutputView: {
    flexDirection:'row',
    paddingTop:20,
    borderWidth:1,
    borderColor:'red',
    height:height*0.25,
    backgroundColor:'darkgrey',
    justifyContent:'flex-end'
}

실제로이 예제에서는 반응 형보기를 만들고 화면보기의 0.25 만보기를 원했기 때문에 화면의 100 %에 다음과 같은 것을 곱하지 않으려면 0.25로 곱했습니다.

textOutputView: {
    flexDirection:'row',
    paddingTop:20,
    borderWidth:1,
    borderColor:'red',
    height:height,
    backgroundColor:'darkgrey',
    justifyContent:'flex-end'
}

2

참고 : 플렉스 개념에 대해 완전히 이해하십시오.

       <View style={{
          flex: 2,
          justifyContent: 'center',
          alignItems: 'center'
        }}>
          <View style ={{
              flex: 1,
              alignItems: 'center, 
              height: 50, 
              borderWidth: 1, 
              borderColor: '#000' 
          }}>
               <Text>Welcome to React Nativ</Text>
           </View>
           <View style={{
              flex: 1,
              alignItems: 'center,
              borderWidth: 1, 
              borderColor: 'red ', 
              height: 50
            }}
            >
              <Text> line 1 </Text>
            </View>
          <View style={{
            flex: 1,
            alignItems: 'center, 
            height: 50, 
            borderWidth: 1,                     
            borderColor: '#000'
          }}>
             <Text>
              Press Cmd+R to reload,{'\n'}
              Cmd+D or shake for dev menu
             </Text>
           </View>
       </View>

1

단지를 제거 alignItems: 'center'컨테이너 스타일을 추가 textAlign: "center"받는 사람 line1아래에 주어진 같은 스타일.

잘 작동합니다

container: {
  flex: 1,
  justifyContent: 'center',
  backgroundColor: '#F5FCFF',
  borderWidth: 1,
}

line1: {
    backgroundColor: '#FDD7E4',
    textAlign:'center'
},

1
Style ={{width : "100%"}}

이 시도:

StyleSheet generated: {
  "width": "80%",
  "textAlign": "center",
  "marginTop": 21.8625,
  "fontWeight": "bold",
  "fontSize": 16,
  "color": "rgb(24, 24, 24)",
  "fontFamily": "Trajan Pro",
  "textShadowColor": "rgba(255, 255, 255, 0.2)",
  "textShadowOffset": {
    "width": 0,
    "height": 0.5
  }
}

질문에 대한 적절한 답변을 제공하십시오. 여기에 관한 내용을 먼저 설명하지 않고 링크를 제공하지 마십시오.
Akaisteph7

-1

width: '100%'그리고 alignSelf: 'stretch'나를 위해 작동하지 않았다. Dimensions내 작업에 적합하지 않았기 때문에 깊게 중첩 된보기에서 작업해야했습니다. 코드를 다시 작성하면 나에게 도움이되는 것이 있습니다. 방금 좀 더 추가 View하고 flex속성을 사용 하여 필요한 레이아웃을 얻었습니다.

  {/* a column */}
  <View style={styles.container}>
    {/* some rows here */}
    <Text style={styles.welcome}>
      Welcome to React Natives
    </Text>
    {/* this row should take all available width */}
    <View style={{ flexDirection: 'row' }}>
      {/* flex 1 makes the view take all available width */}
      <View style={{ flex: 1 }}>
        <Text style={styles.line1}>
          line1
        </Text>
      </View>
      {/* I also had a button here, to the right of the text */}
    </View>
    {/* the rest of the rows */}
    <Text style={styles.instructions}>
      Press Cmd+R to reload,{'\n'}
      Cmd+D or shake for dev menu
    </Text>
  </View>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.