답변:
React Native 0.4.2부터 View 구성 요소에는 onLayoutprop가 있습니다. 이벤트 객체를받는 함수를 전달하십시오. 이벤트 nativeEvent에는보기의 레이아웃이 포함됩니다.
<View onLayout={(event) => {
var {x, y, width, height} = event.nativeEvent.layout;
}} />
onLayout뷰의 크기가 변경 될 때마다 핸들러는 호출됩니다.
주된주의 사항은 onLayout구성 요소가 마운트 된 후 핸들러가 먼저 한 프레임에서 호출되므로 레이아웃을 계산할 때까지 UI를 숨길 수 있습니다.
View치수에 따라 다르게 표시하고 싶다고 가정 해 봅시다 . 뷰 onLayout기능을 사용하여 뷰 표시 방법을 변경하는 방법을 이해하지 못합니다 . 그것이 무한 루프로 이어지지 않습니까?
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 콜백을 만들어 터치 이벤트 위치를 상태로 전달한 다음 자식 구성 요소로 전달할 수 있습니다. 속성으로 설정하면 onLayout 업데이트 상태를 재정의 할 수 있습니다 {[styles.View2, this.state.view2LayoutProps, this.props.touchEventTopLeft]}.
Dimensions모듈을 직접 사용하고 뷰 크기를 계산할 수 있습니다. 실제로, Dimensions기본 창 크기를 제공하십시오.
import { Dimensions } from 'Dimensions';
Dimensions.get('window').height;
Dimensions.get('window').width;
당신을 도울 수 있도록 노력하겠습니다!
업데이트 : 오늘 기본 StyleSheet사용 Flex 하여 뷰를 정렬하면 뷰 크기를 계산하는 대신 넓은 경우 우아한 레이아웃 솔루션으로 깨끗한 코드를 작성할 수 있습니다 ...
기본 창 크기 조정 이벤트에 응답 하는 사용자 지정 그리드 구성 요소를 작성 하더라도 간단한 위젯 구성 요소에서 좋은 솔루션을 생성 할 수 있습니다.
아마도 당신은 사용할 수 있습니다 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심판을 얻고 측정 요소가 사용 가능한지 확인하십시오. 나는 또한 이것에 걸려 넘어졌다.
나를 위해 크기를 사용하도록 설정하는 비율은 나를 위해 일한 것입니다.
width:'100%'
다음은 장치의 전체 뷰의 크기를 가져 오는 코드입니다.
var windowSize = Dimensions.get("window");
다음과 같이 사용하십시오.
width=windowSize.width,heigth=windowSize.width/0.565