Narysuj poziomą linię w React Native

102

Wypróbowałem pakiet react-native-hr - nie działa dla mnie ani na Androidzie ani na iOS.

Poniższy kod również nie jest odpowiedni, ponieważ renderuje trzy kropki na końcu

<Text numberOfLines={1}}>               
    ______________________________________________________________
</Text>
gumkins
źródło
<Text> __________ Level {level} __________ </Text>
Omar bakhsh

Odpowiedzi:

312

Możesz po prostu użyć pustego widoku z dolną ramką.

<View
  style={{
    borderBottomColor: 'black',
    borderBottomWidth: 1,
  }}
/>
Antoine Grandchamp
źródło
52
Polecam borderBottomWidth: StyleSheet.hairlineWidth:)
Ryan Pergent
17
jeśli to nie zadziała, rozważ dodanie alignSelf: 'stretch'.
Scientist1642
1
należy określić wartość WIDTH dla widoku.
Mohamed Ben Hartouz,
dzięki temu można narysować linię, ale po lewej i prawej stronie jest margines. Chcę rysować od końca do końca
Abhi
@Abhi Wydaje się, że jest to problem niezwiązany z tą odpowiedzią. Utwórz nowe pytanie, jeśli nie znajdziesz rozwiązania
Antoine Grandchamp
23

Można użyć marginesu, aby zmienić szerokość linii i umieścić ją w środku.

import { StyleSheet } from 'react-native;
<View style = {styles.lineStyle} />

const styles = StyleSheet.create({
  lineStyle:{
        borderWidth: 0.5,
        borderColor:'black',
        margin:10,
   }
 });

jeśli chcesz nadać margines dynamicznie, możesz użyć opcji Szerokość wymiaru.

Smit
źródło
Dzięki. Mógłbyś też po prostu, <View style = {styles.lineStyle} />ponieważ nic nie jest pomiędzy ;-)
Martin Nordström
Smit styles.lineStyleodpowiadałby const styles = StyleSheet.create({ lineStyle: ... });tutaj. Masz tylko to, lineStyle = { ...}co spowodowałoby problem. Kompletne rozwiązanie z styles.lineStylemoże być const styles = StyleSheet.create({ lineStyle: { borderWidth: 0.5, borderColor: 'black', margin: 10 } });.
kevr
Tak. masz rację. tutaj zakładam, że lineStylewstawiłeś do swojego arkusza stylów.
Smit
13

Udało mi się narysować separator z flexboxwłaściwościami nawet z tekstem w środku linii.

<View style={{flexDirection: 'row', alignItems: 'center'}}>
  <View style={{flex: 1, height: 1, backgroundColor: 'black'}} />
  <View>
    <Text style={{width: 50, textAlign: 'center'}}>Hello</Text>
  </View>
  <View style={{flex: 1, height: 1, backgroundColor: 'black'}} />
</View>

wprowadź opis obrazu tutaj

Azhar Zafar
źródło
1
To najlepsza odpowiedź, skaluje się i jeśli nie ustawisz szerokości tekstu, będzie dynamiczna
newoda
12

Niedawno miałem ten problem.

<Text style={styles.textRegister}> ────────  Register With  ────────</Text>

z tym wynikiem:

Wizerunek

Martin Chinome
źródło
27
To nie jest dobre
Petrus Theron
tak proste jak to.
Siraj Alam,
@PetrusTheron dlaczego nie skaluje się dobrze?
Nate Glenn
Łączniki @NateGlenn będą zawijać się na wąskim ekranie lub będą zbyt cienkie na szerszym.
Petrus Theron
Ach, to ma sens. Myślę, że rozwiązanie jest w porządku, jeśli potrzebujesz tylko bardzo krótkiej linii.
Nate Glenn
9

Zrobiłem to w ten sposób. Mam nadzieję że to pomoże

<View style={styles.hairline} />
<Text style={styles.loginButtonBelowText1}>OR</Text>
<View style={styles.hairline} />

dla stylu:

hairline: {
  backgroundColor: '#A2A2A2',
  height: 2,
  width: 165
},

loginButtonBelowText1: {
  fontFamily: 'AvenirNext-Bold',
  fontSize: 14,
  paddingHorizontal: 5,
  alignSelf: 'center',
  color: '#A2A2A2'
},
sarin upreti
źródło
Myślę, że to najlepsze rozwiązanie. Lepsze niż używanie obramowania, jak inne odpowiedzi.
Erick M. Sprengel
Pewnym problemem może być szerokość kodowania.
Godfrey
5

Możesz też spróbować react-native-hr-component

npm i react-native-hr-component --save

Twój kod:

import Hr from 'react-native-hr-component'

//..

<Hr text="Some Text" fontSize={5} lineColor="#eee" textPadding={5} textStyles={yourCustomStyles} hrStyles={yourCustomHRStyles} />
mehulmpt
źródło
4
To trochę przesada
Led
3

To jest w kodzie React Native (JSX), zaktualizowanym do dzisiaj:

<View style = {styles.viewStyleForLine}></View>

const styles = StyleSheet.create({
viewStyleForLine: {
    borderBottomColor: "black", 
    borderBottomWidth: StyleSheet.hairlineWidth, 
    alignSelf:'stretch',
    width: "100%"
  }
})

możesz użyć jednego alignSelf:'stretch'lub width: "100%"obu, które powinny działać ... i,

borderBottomWidth: StyleSheet.hairlineWidth

więc tutaj StyleSheet.hairlineWidthjest najcieńszy,

borderBottomWidth: 1,

i tak dalej, aby zwiększyć grubość linii.

Sree
źródło
3

Stworzenie Linekomponentu wielokrotnego użytku zadziałało dla mnie:

import React from 'react';
import { View } from 'react-native';

export default function Line() {
    return (
        <View style={{
            height: 1,
            backgroundColor: 'rgba(255, 255, 255 ,0.3)',
            alignSelf: 'stretch'
        }} />
    )
}

Teraz importuj i używaj w Linedowolnym miejscu:

<Line />
Mohammad Zaid Pathan
źródło
2
import { View, Dimensions } from 'react-native'

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

// Create Component

<View style={{
   borderBottomColor: 'black', 
   borderBottomWidth: 0.5, 
   width: width - 20,}}>
</View>
Filip Ilievski
źródło
2

Możesz użyć rodzimego separatora elementu.

Zainstaluj go za pomocą:

npm install --save react-native-elements
# or with yarn
yarn add react-native-elements

import { Divider } from 'react-native-elements'

Następnie przejdź do:

<Divider style={{ backgroundColor: 'blue' }} />

Źródło

shanthan
źródło
2
Instalowanie całego pakietu (i prawdopodobnie dużego) wydaje się przesadą, jeśli potrzebujesz tylko poziomej linii.
Sandy
To prawda, że ​​jest to przesada, jeśli będziesz używać tylko <Divider /> komponentu, jednak powinieneś korzystać z biblioteki w obie strony, aby zaoszczędzić czas na stylizowaniu prostych przycisków, pasków wyszukiwania itp. Itd ... Sprawdź wszystko, co może zrobić dla Twojej aplikacji react-native-elements.github.io/react-native-elements
jso1919
1

Dlaczego nie zrobisz czegoś takiego?

<View
  style={{
    borderBottomWidth: 1,
    borderBottomColor: 'black',
    width: 400,
  }}
/>
Viktor Sec
źródło
0

Może powinieneś spróbować użyć polecenia act-native-hr w następujący sposób:

<Hr lineColor='#b3b3b3'/>

dokumentacja: https://www.npmjs.com/package/react-native-hr

J Dorrian
źródło
patrząc na problemy w repozytorium, nie wydaje się być tak "aktywny" i aktualny pod względem zależności :(
Made in Moon
0
import {Dimensions} from 'react-native'

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

<View
  style={{
         borderBottomColor: '#1D3E5E',
         borderBottomWidth: 1,
         width : width , 
  }}
/>
Mohamed Ben Hartouz
źródło
Kod jest tak jasny dla tych, jak mają tego rodzaju problemy, więc jeśli mogę wyjaśnić więcej, zrobię to.
Mohamed Ben Hartouz,
0

Oto jak rozwiązałem separator z poziomymi liniami i tekstem na środku:

<View style={styles.divider}>
  <View style={styles.hrLine} />
  <Text style={styles.dividerText}>OR</Text>
  <View style={styles.hrLine} />
</View>

I style do tego:

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

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

const styles = StyleSheet.create({
divider: {
    flexDirection: 'row',
    alignItems: 'center',
    marginTop: 10,
  },
  hrLine: {
    width: width / 3.5,
    backgroundColor: 'white',
    height: 1,
  },
  dividerText: {
    color: 'white',
    textAlign: 'center',
    width: width / 8,
  },
})
Laszlo
źródło
0

Po prostu utwórz komponent View, który ma małą wysokość.

<View style={{backgroundColor:'black', height:10}}/>
Dozorca parku
źródło
0

Jeśli masz jednolite tło (np. Białe), może to być rozwiązanie:

<View style={container}>
  <View style={styles.hr} />
  <Text style={styles.or}>or</Text>
</View>

const styles = StyleSheet.create({
  container: {
    flex: 0,
    backgroundColor: '#FFFFFF',
    width: '100%',
  },
  hr: {
    position: 'relative',
    top: 11,
    borderBottomColor: '#000000',
    borderBottomWidth: 1,
  },
  or: {
    width: 30,
    fontSize: 14,
    textAlign: 'center',
    alignSelf: 'center',
    backgroundColor: '#FFFFFF',
  },
});
Darius Rainys
źródło