React Native TextInput在iOS上渲染文本太高,切断了一些字符的顶部

Posted

技术标签:

【中文标题】React Native TextInput在iOS上渲染文本太高,切断了一些字符的顶部【英文标题】:React Native TextInput rendering text too high on iOS, cutting off the tops of some characters 【发布时间】:2020-05-10 02:47:06 【问题描述】:

我的 react native 应用中有一个简单的 TextInput。以下是相关代码:

<View style=styles.AmountWrapper>
    <TextInput
        multiline=true
        placeholder="$0"
        placeholderTextColor=colors.black38
        style=styles.NumberInput
        keyboardType="numeric"
    />
</View>

let styles = StyleSheet.create(
    AmountWrapper: 
        flexDirection: "column",
        flex: 1,
        alignItems: "center",
        justifyContent: "center",
        backgroundColor: colors.white
    ,
    NumberInput: 
        flexDirection: "row",
        alignItems: "center",
        flex: 0,
        fontFamily: styleHelper.fontFamily("medium"),
        fontSize: 48,
        paddingHorizontal: 16,
        paddingTop: 0,
        paddingBottom: 0,
        color: colors.blue,
        textAlign: "center",
        borderWidth: 0,
        textAlignVertical: "center"
    ,
);

我正在使用 android 9.0 和 Xcode 的模拟器模拟 ios 12.4 iPhone X 的 Android Studio Pixel 3。

在 Android 上,这正是我想要的效果:

问题在于 iOS。它使文本太高了,切断了美元符号的顶部,以及数字的几个像素。它使用占位符和当用户输入文本时这样做:

我尝试过更改边距、填充、textAlign、lineHeight、flexDirection、alignItems 和 justifyContent。我还在 TextInput 中尝试过 multiline=false

如何让 iOS 进一步向下渲染文本并在 TextInput 中正确显示?

【问题讨论】:

用尽所有其他选项后,字体文件本身似乎存在问题。不确定到底是什么问题,但其他字体不会产生这个问题。 Android 没有问题,但 iOS 有。 【参考方案1】:

我认为您对 IOS 上的 height 和 lineHeight 的正常行为有一些影响。在 IOS 上,在 react native 中为 textInput 设置 lineHeight 或设置高度都适用。我建议将其中一个设置为至少与你的 fontSize 一样大的大小,然后在你的样式中注释掉线条,以通过消除过程找出是哪一个导致它。下面是一个在我的一个项目中有效的样式示例:

         <TextInput style=styles.inputsTwo
                accessible=this.state.access
    placeholder="Email"
    clearButtonMode="always"
            onChangeText=text => this.setState(email: text)
            value=this.state.email
    />
    <TextInput style=styles.inputs
                accessible=this.state.access
    placeholder="Password"
    secureTextEntry=true
    clearButtonMode="always"
            onChangeText=text => this.setState(password: text)
            value=this.state.password
    />

然后在我拥有的样式中:

   inputs: 
     textDecorationLine: 'underline',
     marginBottom: 5,
     textAlign: 'left',
     marginLeft: 30,
     marginRight: 30,
     borderBottomColor: '#808080',
     borderBottomWidth: 2,
     height: 48,
     fontSize: 48
 ,
   inputsTwo: 
    textDecorationLine: 'underline',
    marginBottom: 10,
    textAlign: 'left',
    marginLeft: 30,
    marginRight: 30,
    borderBottomColor: '#808080', 
    borderBottomWidth: 2,
    height: 48,
    fontSize: 48
,

【讨论】:

以上是关于React Native TextInput在iOS上渲染文本太高,切断了一些字符的顶部的主要内容,如果未能解决你的问题,请参考以下文章

一键后iOS上的React Native TextInput隐藏键盘

TextInput 忽略 React Native 上的双击(句点)

React Native TextInput在iOS上渲染文本太高,切断了一些字符的顶部

React Native 组件之TextInput

React Native 之 TextInput(多个语法知识)

TextInput 从右到左开始,React native