Как рассчитать ширину текста в компоненте TextInput в React Native?
Я пытался сделать автоматический ввод TextInput, т.е. высота TextInput увеличивается, когда текст завернут в следующую строку.
Итак, я пытаюсь рассчитать ширину текста и сравнить его ширину ширины TextInput. Если он больше ширины, высота TextInput будет увеличиваться.
Итак, мой вопрос заключается в том, как рассчитать ширину текста?
Существуют ли какие-либо другие способы для достижения эффекта автоматического масштабирования?
Спасибо!
Ответы
Ответ 1
В настоящее время нет простого способа получить внутреннюю ширину содержимого TextInput
.
React Native плохо нуждается в автоматическом вводе текста, как тот, который вы описываете. Я тоже мог бы использовать его, поэтому, когда я нахожу время, я могу попытаться написать его.
Тем временем, обходной путь для выполнения того, что вы описываете:
-
Создайте TextInput
с его начальной (фиксированной) высотой.
-
Создайте клонированный элемент <Text>
где-нибудь вне экрана (например, используйте абсолютное положение) с тем же стилем, что и TextInput
. Это легко сделать благодаря декларативной природе атрибута React style
. Установите ширину равной ширине, как ваш TextInput
.
- Если ваш
TextInput
имеет гибкую ширину, вы можете посмотреть onLayout
или measure
, чтобы получить ширину, в противном случае есть способы автоматически визуализировать клон с одинаковой шириной (например, поместить его в один и тот же контейнер, но за кадром).
-
Напишите onChange
обработчик для TextInput
, который:
(a) Обновляет клон в любое время, когда текст TextInput
изменяется
(b) Измеряет высоту клона (поскольку элементы <Text>
автоматически сортируются)
(c) Устанавливает новую высоту TextInput
Хотя это своего рода боль, вам нужно только написать ее один раз. Его можно легко инкапсулировать в компонент (например), который затем можно использовать с безнаказанностью.
Ответ 2
Хотя я не отвечаю на заданный вопрос, я хочу указать, что автомасштабирование TextInput
может быть легко реализовано в 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)
});
}
}
Смотрите: TextInput # onContentSizeChange
Экспо-закуска Пример https://snack.expo.io/HkqE2AhAe