【问题标题】:Centering TextInput with dynamic width in React Native在 React Native 中以动态宽度居中 TextInput
【发布时间】:2018-06-26 21:22:47
【问题描述】:

我正在尝试使文本输入居中,其宽度是文本输入的长度。但是,当我使用 alignSelf: 'center' 或 alignItems: 'center' 时,文本输入在没有宽度的情况下是不可见的。

例如:

render() {
  return <View style={{flex: 1}}>
    <TextInput style={{alignSelf: 'center', minWidth: 1}}>
  <View/> 
}

这里的 minWidth 确保 textInput 可以被看到,但是当你输入它时它不会扩展。如果没有 width / minWidth,除非移除居中样式,否则不会看到 textInput。

几乎可行的解决方法示例:

constructor(props) {
  super(props)

  this.state = {
    txt: ""
    txtWidth: 0
  }
}

render() {
  return <View style={{flex: 1}}>
    <TextInput
      style={{minWidth: 1, alignSelf: 'center', width: this.state.txtWidth}}
      value={this.state.txt}
      onChange={txt=>this.setState({txt: txt.nativeEvent.text})}
    />
    <Text
      style={{position: 'absolute', right: 100000}}
      onLayout={e=>this.setState({txtWidth:e.nativeEvent.layout.width})}
    >
      {this.state.txt}
    </Text>
  <View/>
}

随着文本输入接收输入,它的大小会变大并且效果很好。然而,有一件事阻止了它被充分证明。 emoji 的 e.nativeEvent.layout.width 值始终为 20。给定 emoji 的实际宽度不是 20。因此 txtWidth 不再是 textInput 的正确宽度,并且 textInput 的片段现在被切断。

有没有人为具有动态宽度的居中文本输入提出一个好的解决方案。我已经被这件事难住了太久了。如果需要,也很乐意提供说明。

谢谢!

【问题讨论】:

  • 正则表达式表情符号并计算您的输入宽度
  • 我仍然希望能够允许表情符号,所以正则表达式(我假设删除)并不能完全解决我的解决方案。但好建议!
  • 我的意思是保留你的表情,稍后我会发布答案
  • 我需要管理游标,所以可能不会那么快。

标签: javascript reactjs react-native


【解决方案1】:

抱歉让你久等了,终于有时间完成这个了。使用ViewImageText 来伪造TextInput

  • 第一步:更改时格式化文本

您仍然需要TextInput。 文字中的表情符号可能看起来像:fire:?,我选择后者。 当文本更改时,使用正则表达式将所有表情符号表达式替换为表情符号字符。 然后你移动光标它不会在表情符号内停止

  • 第二套:伪造TextInput

应该是这样的

<View style={{flexDirection: 'row', flexWrap: 'wrap'}}>
  <Image style={styles.img} source={{uri: some_emoji}} />
  <Text>
    {"s"}
  </Text>
  <Text>
    {"s"}
  </Text>
  <MyCursor />
</View>

表情符号图像应该在相同的宽度内,并且要获得文本的宽度可能看起来像

<Text onLayout={(event) => {
  var {x, y, width, height} = event.nativeEvent.layout;
}} />

然后您可以获得总长度并调整您的View 的大小并隐藏您的真实TextInput 并管理光标,它在网络上工作虽然不是那么顺利。 这就是为什么我为每个字符使用Text,例如&lt;Text&gt;{"s"}&lt;/Text&gt;,当您单击每个字符以及发生焦点、模糊和按键时,光标索引应该会发生变化。您可以参考https://github.com/postor/react-input-emoji/blob/master/pages/index.js 获取我尝试过的网络版虚假输入,但剪切、粘贴和很多事情仍未处理

【讨论】:

  • 试一试,但最终放弃了。处理所有伪造文本输入的情况非常令人生畏,特别是当我想要的只是一个居中的文本输入时(疯狂地认为这是一个问题或更多的人不需要它)我会继续并将其标记为正确,因为您的解决方案可能会付出足够的努力。谢谢你的帮助
猜你喜欢
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2012-03-03
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多