2016-05-10 9 views
7

Chcę mieć widok, którego szerokość reaguje na szerokość kontenera, zachowując proporcje. Nie chcę sztywnego kodu szerokości ani wysokości, ale zachowuj go dynamicznie i elastycznie, aby mógł być ponownie użyty w wielu sytuacjach jako składnik wielokrotnego użytku.Jak dynamicznie ustawić wysokość widoku na podstawie jego szerokości, zachowując proporcje?

Mam nadzieję, że działa podobnie do następującego kodu:

<View style={{ 
    alignSelf: 'stretch', 
    aspectRatio: 1.5 
}} /> 

Należy wypełnić szerokość jego pojemnik i ustawić własną wysokość dynamicznie na podstawie jego szerokości.

Czy jest to możliwe w reakcji na działanie fleksograficzne?

+0

Dzięki za poinformowanie mnie ** istnieje właściwość stylu 'aspectRatio' w React Native! Taki oszczędny wysiłek! –

Odpowiedz

2

Jak skomentował Hendy Irawan, React Native dodany aspectRatio właściwość StyleSheet.

https://facebook.github.io/react-native/docs/layout-props.html#aspectratio

Z dokumentu:

aspectRatio ?: numer

Proporcje kontrola wielkość nieokreślonym wymiarze węzła. Współczynnik proporcji jest niestandardową właściwością dostępną tylko w trybie macierzystym , a nie w CSS.

Na węźle kontroli formatu obrazu zestaw szerokość/wysokość wielkość wyłączonym wymiar w węźle z zestawem elastycznego stosunku podstawę obrazu steruje rozmiar węzła w osi przekroju czy wyłączony Na węźle Współczynnik proporcji funkcji pomiaru działa tak, jak gdyby funkcja pomiaru mierzy podstawę elastyczną W węźle ze współczynnikiem wydłużenia/zmniejszenia obrazu steruje rozmiarem węzła w osi poprzecznej, jeśli nie jest ustawiony współczynnik proporcji uwzględnia wymiary min./maks.

Dlatego powinny działać następujące elementy:

const styles = StyleSheet.create({ 
    view: { 
    aspectRatio: 1.5, 
    } 
}); 

// later in render() 
<View style={styles.view} /> 
1

Tak, można użyć parametru Dimensions API, aby uzyskać szerokość okna, a następnie ustawić wysokość programowo. Zwykle wywołuję wymiary zaraz po załadowaniu aplikacji, zanim trzeba będzie znać szerokość, a następnie po prostu przekazać obiekt w razie potrzeby.

Może to być niestandardowy komponent do wykonania Twojego przypadku użycia.

import {Dimensions} from 'react-native' 

... 

const AspectView = ({style, aspectRatio, children, ...props}) => { 
    let {height, width} = Dimensions.get('window'); 
    return (
    <View style={[style, {height: width * aspectRatio}] {...props}>{children}</View> 
) 
} 
+0

Ale to oznacza, że ​​zależy to od szerokości * okna *, a nie od * kontenera * (rodzica). Jak ustawić go na podstawie szerokości rodzica? –

+0

Nie wierzę, że działa w ten sposób (w przeciwieństwie do web css). Najlepiej jest programowo obliczyć rodzica, a następnie przekazać go w dół. –

+0

Naprawdę nie rozumiem, dlaczego nie jest to możliwe w aplikacji mobilnej. Jeśli rodzic zna swoją szerokość (niezależnie od tego, czy jest ona stała czy obliczona), dlaczego dzieci nie powinny mieć dostatecznej znajomości szerokości swojego rodzica. 'alignSelf =" stretch "' działa cudownie, więc powinno być możliwe rozszerzenie tego, aby umożliwić dziecku ustawienie atrybutu opartego na szerokości rodzica (zamiast okna)? –

Powiązane problemy