当前位置: 首页 > 知识库问答 >
问题:

反应原生适合文本组件

葛景龙
2023-03-14

我试图将我的文本放在可用区域内,我的约束是这样的:

  • 文本不应溢出,
  • 文本必须在所有可用视图内放大,
  • 单词不应拆分为字符,可以转到下一行句子,
  • 当我在父视图中使用flex时,文本在水平方向上的视图扩展不能超过屏幕宽度

下面是我的代码片段:

import React from "react";
import { StyleSheet, Text, View } from "react-native";
import { Font } from "expo";
import Lorem from "./src/helpers/lorem-ipsum-gen";

export default class App extends React.Component {
  constructor() {
    super()
    this.state = {
      fontLoaded: false,
    };
  }
  //theboldfont.ttf
  async componentWillMount() {
    await Font.loadAsync({
      "akzidenz-grotesk-bq-bold": require("./assets/fonts/AkzidenzGrotesk_BQ_Bold.otf"),
    });
    this.setState({ fontLoaded: true });
  }

  render() {
    let loremText = new Lorem().generate(20)

    return (
      <View style={styles.container}>
        <View>
          <View style={{ flex: 0.37 }} > </View>
          <View style={{ flex: 0.25, backgroundColor: "red" }} >
            <View >
              {
                this.state.fontLoaded ? (<Text
                  style={{ fontFamily: "akzidenz-grotesk-bq-bold", fontSize: 50 }}
                  adjustsFontSizeToFit={true}
                >
                  {loremText}
                </Text>) : null
              }

            </View>
          </View>
          <View style={{ flex: 0.38 }} >
            <Text>
              {loremText}
            </Text>
          </View>
        </View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    alignItems: "center",
    justifyContent: "center",
  },
});

结果是:

我努力实现我的目标:

共有2个答案

祁正阳
2023-03-14

注意:此解决方案需要反复试验,并假设容器大小固定。

可以使用插值函数根据最长行的长度缩小文本。

插值函数示例(随意取我的插值函数):

const fontSizeInterpolator = Interpolator.getInterpolator({
    input:  [4,  5,  6,  7,  8,  10, 11, 13, 40],
    output: [45, 45, 32, 28, 28, 22, 19, 15, 10]
});

这意味着如果最长的行是四个字符长,请将字体设置得非常大。如果最长的行是40个字符长,请将字体设置得非常小。经过反复试验,特定的行长度映射到特定的字体大小。

通过正常逻辑查找文本中最长的一行(这里每行只有一个单词):

const words = props.text.split(' ');
let longestWord = words[0];
for (const word of words) {
  if (word.length > longestWord.length) {
    longestWord = word;
  }
}

然后从您的插值器中获取字体大小:

const fontSize = fontSizeInterpolator(longestWord.length);

输出示例:

姚正真
2023-03-14

因此,在尝试了文本组件上的新事物后,我发现如果不指定< code > number of lines = { number } ,则< code > adjustsFontSizeToFit = { true } 无法工作,但是它有时会在行尾将我的单词分成字符。从文档来看,它可能在Android系统中不可用。所以我仍然需要一个更好的方法来解决我的问题

 类似资料:
  • 我试图设置与React Native在Android上。做了一些研究,看起来我应该使用Interceptor。我找到的一个例子解释了如何做到这一点(链接),但我不确定如何注册拦截器。 因此,为了设置,我使用这个类: 那么剩下的就是注册上面的拦截器,那么它应该在哪里完成呢?可能在? 我在构建应用程序时没有收到任何错误,因此我认为应该很好-只需要让应用程序使用它。 更新:我当前正在尝试在中注册拦截器,

  • 是否有一种简单的方法可以将样式应用于特定类型的所有组件,例如或>等,以响应本地构建模板 例如,我希望对所有场景中的所有文本组件使用样式。有没有比每次使用Text组件时指定样式更容易实现的方法 还是需要创建自定义文本组件?并使用它代替基本组件,如下面的示例。使用代替

  • flexDirection设置为行文本的视图内的文本组件从视图中消失。 我尝试将弹性包装设置为包装,但它仍然不起作用。 我希望最后一个元素转到第二行,但它只是从屏幕上消失了。 文本离开视图

  • 我用react本地开发了一个应用程序