vscode visual studio react code close react-native

visual - Escala automática de altura de imagen con React Native



vscode auto close tags jsx (6)

Aquí hay una idea general de una solución bastante simple que aprovecha la propuesta de para usar aspectRatio:

https://gist.github.com/tpraxl/02dc4bfcfa301340d26a0bf2140cd8b9

No hay magia ni cálculos necesarios. Puro "CSS" si conoces las dimensiones de la imagen original.

En mi aplicación React Native, estoy obteniendo imágenes de una API con dimensiones desconocidas. ¿Cómo escala automáticamente la altura si conozco el ancho deseado?

Ejemplo:

Establecí el ancho a Dimensions.get(''window'').width . ¿Cómo establecer la altura y mantener la misma proporción?

export default class MyComponent extends Component { constructor(props) { super(props) this.state = { imgUrl: ''http://someimg.com/coolstuff.jpg'' } } componentDidMount() { // sets the image url to state this.props.getImageFromAPi() } render() { return ( <View> <Image source={uri: this.state.imgUrl} style={styles.myImg} /> <Text>Some description</Text> </View> ) } } const styles = StyleSheet.create( myImg: { width: Dimensions.get(''window'').width, height: >>>???what goes here???<<< } )




Primero intente esto y vea si funciona para usted: https://github.com/facebook/react-native/commit/5850165795c54b8d5de7bef9f69f6fe6b1b4763d

Si no lo hace, entonces puede implementar su propio componente de imagen. Pero en lugar de tomar ancho como prop, anula el método onLayout que te da el ancho deseado para que puedas calcular la altura. Esto funciona mejor si no sabes el ancho y quieres que RN haga el diseño por ti. El inconveniente es que onLayout se llama después de un paso de diseño y representación. Por lo tanto, es posible que note que sus componentes se mueven un poco.


Prueba esto:

import React, { Component, PropTypes } from "react"; import { Image } from "react-native"; export default class ScaledImage extends Component { constructor(props) { super(props); this.state = { source: { uri: this.props.uri } }; } componentWillMount() { Image.getSize(this.props.uri, (width, height) => { if (this.props.width && !this.props.height) { this.setState({ width: this.props.width, height: height * (this.props.width / width) }); } else if (!this.props.width && this.props.height) { this.setState({ width: width * (this.props.height / height), height: this.props.height }); } else { this.setState({ width: width, height: height }); } }); } render() { return ( <Image source={this.state.source} style={{ height: this.state.height, width: this.state.width }} /> ); } } ScaledImage.propTypes = { uri: PropTypes.string.isRequired, width: PropTypes.number, height: PropTypes.number };

Estoy pasando la URL como un prop llamado uri . Puede especificar su prop de width como Dimensions.get(''window'').width y eso debería cubrirlo.

Tenga en cuenta que esto también funcionará si sabe a qué desea configurar la altura y necesita cambiar el tamaño del ancho para mantener la proporción. En ese caso, debe especificar la height puntal en lugar del width .


La versión TypeScript de @TheJizel responde con propiedad de style opcional y devolución de llamada de failure en Image.getSize :

import * as React from ''react'' import {Image} from ''react-native'' interface Props { uri: string width?: number height?: number style? } interface State { source: {} width: number height: number } export default class ScaledImage extends React.Component<Props, State> { constructor(props) { super(props) this.state = { source: {uri: this.props.uri}, width: 0, height: 0, } } componentWillMount() { Image.getSize(this.props.uri, (width, height) => { if (this.props.width && !this.props.height) { this.setState({width: this.props.width, height: height * (this.props.width / width)}) } else if (!this.props.width && this.props.height) { this.setState({width: width * (this.props.height / height), height: this.props.height}) } else { this.setState({width: width, height: height}) } }, (error) => { console.log("ScaledImage:componentWillMount:Image.getSize failed with error: ", error) }) } render() { return <Image source={this.state.source} style={[this.props.style, {height: this.state.height, width: this.state.width}]}/> } }

Ejemplo de uso:

<ScaledImage style={styles.scaledImage} uri={this.props.article.coverImageUrl} width={Dimensions.get(''window'').width}/>