【问题标题】:React Native - how to set fixed width to individual characters (number, letter, etc)React Native - 如何为单个字符(数字、字母等)设置固定宽度
【发布时间】:2016-12-20 09:10:49
【问题描述】:

我正在构建的 React Native 应用程序出现问题。我有一个秒表,因为每个数字字符都有不同的宽度,所以当时间增加时,文本开始在整个地方移动,而不是保持固定宽度。

例如,如果您有移动 iOS 设备,请打开随附的默认时钟应用并使用秒表。您会注意到00:00:00 系列中的每个字符都有固定的宽度,或者至少看起来是这样。如果 0 中的一个变成 1,即使 1 的宽度看起来更小,它仍然会填充相同数量的空间,因此文本不会到处乱跳。

然而,在我的 React Native 应用程序中,情况并非如此。 1 占用的宽度小于 0 或任何其他数字,所以它会使文本到处乱跳,真的很烦人。

这是一个很好的工作版本(请注意,每次更改数字时,数字所在的“容器”的宽度永远不会改变?)这确保了平稳过渡:

现在看看我的版本,一场灾难:

我似乎找不到解决办法。

我觉得解决这个问题的一种方法是将每个字符放在一个单独的 <Text> 标记中,并设置宽度,但我知道这完全是矫枉过正。必须有更简单的方法来做到这一点。

任何指导将不胜感激。

【问题讨论】:

  • 使用固定宽度的字体是最简单的解决方案。
  • 嗯,可以工作,我还没有在 React Native 中使用自定义字体,所以我还没有想到那个选项。谢谢!

标签: javascript ios react-native


【解决方案1】:

iOS 中的系统字体是 San Francisco,默认情况下具有比例数字,但包含固定宽度(等宽)数字的选项。使用 react-native,您必须在 Text 组件的样式上使用 fontVariant 属性:

<Text style={{fontVariant: ['tabular-nums']}}>
  1,234,567,890.12
</Text>

我很难找到它,因为它的名称不明确,也不是通常使用的名称。这是 RN 文档上 Text 道具的链接:https://facebook.github.io/react-native/docs/text.html#style

【讨论】:

  • 这是一个很好的答案!
  • 我已经找了好几个小时了。完美的解决方案!
【解决方案2】:

虽然这个问题是针对 iOS 标记的,但如果有人正在寻找在 iOS Android 上都支持等宽文本的通用解决方案(就像我一样),那么这里有一个额外的资源给你!

字体选择:

react-native-training/react-native-fonts 在 GitHub 上有一个很好的每个平台上的字体列表。如您所见,OP 在their answer 中提供的等宽字体之间没有重叠。但是,Android 有一种名为“monospace”的字体适用于这种用例。

操作系统条件语句

由于如果 fontFamily 中的字体不存在,React Native 会抛出错误,我们需要根据操作系统中可用的字体有条件地设置 fontFamily。 react-native 中的Platform.OS 可用于确定设备操作系统。

示例

// components/TextFixedWidth.js
import React from 'react'
import { Platform, Text } from 'react-native'

export default function TextFixedWidth ({ children }) {
  const fontFamily = Platform.OS === 'ios' ? 'Courier' : 'monospace'

  return (
      <Text style={{fontFamily}}>{ children }</Text>
  )
}

然后

// in a render method somewhere in the app
<TextFixedWidth>
  Any monospace text you want!
</TextFixedWidth>

我希望这会有所帮助:)

【讨论】:

  • 请记住,React Native 也用于桌面(Mac 和 Windows)。等宽字体可能不适用于所有字体。
  • 这个答案已经很老了,自从我 3 年前使用它以来,RN 已经发生了变化。看起来 Ethan O's answer using fontVariant 是一种更简单的方法。如果这不起作用,那么Platform.select() 方法也可能有用。抱歉,您必须阅读文档 + 实验,因为我现在没有设置 RN 来提供复制和粘贴解决方案。
【解决方案3】:

感谢@ppeterka,我找到了一个超级简单的解决方案,只需要一行代码:使用等宽字体。

以下是 iOS 附带的一些可用等宽字体的列表:

快递

Courier-Bold

Courier-BoldOblique

快递-斜交

新快递

CourierNewPS-BoldItalicMT

CourierNewPS-BoldMT

CourierNewPS-ItalicMT

CourierNewPSMT

Menlo-Bold

Menlo-BoldItalic

Menlo-斜体

Menlo-Regular

【讨论】:

  • 我很确定“Helvetica Neue”是官方 iOS 秒表应用程序中使用的字体,因为它看起来相同并且具有固定宽度的数字。
  • 也可以是"Avenir" or "Avenir Next",虽然我无法让字体粗细看起来正确。
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多