ios - number - ¿Cómo calcular el ancho del texto en un componente TextInput en React Native?
textinput placeholder react native (2)
Actualmente no hay una manera fácil de obtener el ancho del contenido interno de un TextInput
.
React Native necesita urgentemente una entrada de texto autosómica como la que describes. Podría usar uno también, así que cuando encuentre tiempo, puedo tratar de escribir uno.
Mientras tanto, aquí hay una solución para lograr lo que describes:
Crea tu
TextInput
con su altura inicial (fija).Cree un elemento
<Text>
clonado en algún lugar fuera de la pantalla (por ejemplo, use la posición absoluta) con el mismo estilo queTextInput
. Esto es fácil de hacer gracias a la naturaleza declarativa del atributo destyle
de React. Establezca el ancho del mismo ancho que suTextInput
.Escriba un controlador
onChange
paraTextInput
que: (a) Actualice el clon cada vez que cambie el texto deTextInput
(b) Mida la altura del clon (ya que los elementos de<Text>
autosize) (c)Textinput
la nueva altura delTextinput
Aunque esto es un poco doloroso, solo tienes que escribirlo una vez. Se puede encapsular fácilmente en un componente (por ejemplo) que luego puede reutilizar con impunidad.
Intenté hacer que TextInput fuera auto escalado, es decir, el alto de TextInput aumenta a medida que el texto se ajusta a la siguiente línea.
Por lo tanto, estoy tratando de calcular el ancho del texto y compararlo con el ancho del TextInput. Si es mayor que el ancho, la altura de TextInput aumentará.
¿Entonces mi pregunta es cómo calcular el ancho del texto? ¿Hay alguna otra forma de lograr el efecto de autoescalamiento?
¡Gracias!
Aunque no respondo la pregunta, quiero señalar que el TextInput
escalado automático se puede implementar fácilmente en React Native 0.34.
class AutoScaleTextInput extends React.Component {
constructor() {
super();
this.state = {
inputHeight: 35
};
}
render() {
return (
<TextInput
multiline={true}
style={{
height: this.state.inputHeight
}}
onContentSizeChange={ this._onTextContentSizeChange }/>
);
}
_onTextContentSizeChange = (event) => {
this.setState({
inputHeight: Math.min(event.nativeEvent.contentSize.height, 100)
});
}
}
Ver: TextInput # onContentSizeChange
Ejemplo de Expo Snack https://snack.expo.io/HkqE2AhAe