Можно ли получить размер (ширину и высоту) определенного вида? Например, у меня есть представление, показывающее прогресс:
<View ref='progressBar' style={{backgroundColor:'red',flex:this.state.progress}} />
Мне нужно знать фактическую ширину представления, чтобы правильно выровнять другие представления. Это возможно?
ios
react-native
Мэтью
источник
источник
View
разному в зависимости от размеров. Я не понимаю, как я могу использоватьonLayout
функцию View, чтобы изменить способ отображения View. Разве это не приводит к бесконечному циклу?onLayout
это не имеет отношения.Это единственное, что у меня сработало:
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, Image } from 'react-native'; export default class Comp extends Component { find_dimesions(layout){ const {x, y, width, height} = layout; console.warn(x); console.warn(y); console.warn(width); console.warn(height); } render() { return ( <View onLayout={(event) => { this.find_dimesions(event.nativeEvent.layout) }} style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> <Text style={styles.instructions}> To get started, edit index.android.js </Text> <Text style={styles.instructions}> Double tap R on your keyboard to reload,{'\n'} Shake or press menu button for dev menu </Text> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, }); AppRegistry.registerComponent('Comp', () => Comp);
источник
В основном, если вы хотите установить размер и изменить его, установите его в состояние на макете следующим образом:
import React, { Component } from 'react'; import { AppRegistry, StyleSheet, View } from 'react-native'; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: 'yellow', }, View1: { flex: 2, margin: 10, backgroundColor: 'red', elevation: 1, }, View2: { position: 'absolute', backgroundColor: 'orange', zIndex: 3, elevation: 3, }, View3: { flex: 3, backgroundColor: 'green', elevation: 2, }, Text: { fontSize: 25, margin: 20, color: 'white', }, }); class Example extends Component { constructor(props) { super(props); this.state = { view2LayoutProps: { left: 0, top: 0, width: 50, height: 50, } }; } onLayout(event) { const {x, y, height, width} = event.nativeEvent.layout; const newHeight = this.state.view2LayoutProps.height + 1; const newLayout = { height: newHeight , width: width, left: x, top: y, }; this.setState({ view2LayoutProps: newLayout }); } render() { return ( <View style={styles.container}> <View style={styles.View1}> <Text>{this.state.view2LayoutProps.height}</Text> </View> <View onLayout={(event) => this.onLayout(event)} style={[styles.View2, this.state.view2LayoutProps]} /> <View style={styles.View3} /> </View> ); } } AppRegistry.registerComponent(Example);
Вы можете создать гораздо больше вариантов того, как его следует изменить, используя это в другом компоненте, который имеет другое представление в качестве оболочки, и создать обратный вызов onResponderRelease, который может передать местоположение события касания в состояние, которое затем может быть передано дочернему компоненту as свойство, которое может переопределить обновленное состояние onLayout путем размещения
{[styles.View2, this.state.view2LayoutProps, this.props.touchEventTopLeft]}
и т. д.источник
Возможно, вы можете использовать
measure
:measureProgressBar() { this.refs.welcome.measure(this.logProgressBarLayout); }, logProgressBarLayout(ox, oy, width, height, px, py) { console.log("ox: " + ox); console.log("oy: " + oy); console.log("width: " + width); console.log("height: " + height); console.log("px: " + px); console.log("py: " + py); }
источник
NativeMethodsMixin
. Что бы я ни делал,measure
это всегда не определено. Есть указатели?NativeMethodsMixin
функцию, она доступна только для некоторых элементов. НапримерTouchableWithFeedback
, есть функция измерения, а у обычногоTouchable
нет. Попробуйте изменить тип, которыйView
вы используете, получите ссылку и проверьте, доступен ли элемент меры. Я тоже наткнулся на это.Вы можете напрямую использовать
Dimensions
модуль и рассчитывать размеры ваших просмотров. Собственно,Dimensions
даю вам размеры главного окна.import { Dimensions } from 'Dimensions'; Dimensions.get('window').height; Dimensions.get('window').width;
Надеюсь помочь вам!
Обновление : Сегодня использование нативным
StyleSheet
с Flex организации на ваших взгляды помогают писать чистый код с элегантными решениями компоновок в широких случаях вместо вычислительных ваших размеров вида ...Хотя создание настраиваемых компонентов сетки , которые реагируют на события изменения размера главного окна, может дать хорошее решение в простых компонентах виджетов.
источник
Вот код, чтобы получить размеры полного вида устройства.
var windowSize = Dimensions.get("window");
Используйте это так:
width=windowSize.width,heigth=windowSize.width/0.565
источник
для меня установка размеров для использования% - это то, что сработало для меня
width:'100%'
источник