在 iOS 和 Android 中使用相同的代码但垂直边距的结果不同的 React Native 应用程序

Posted

技术标签:

【中文标题】在 iOS 和 Android 中使用相同的代码但垂直边距的结果不同的 React Native 应用程序【英文标题】:React Native app with same code but different result for vertical margins in iOS and Android 【发布时间】:2020-09-04 13:49:37 【问题描述】:

我在 android (Galaxy S7) 和 ios (iPhone S8+) 上测试了一个简单的 render(),得到了我不明白的结果。

S7 的 dp 高度(与密度无关的像素)是 640,而 iPhone 8 Plus 的高度是 736 dp,所以我预计 iPhone 8+ 上的“电子邮件”和“密码”之间的距离会稍微小一些,但不是那么小…… 第二个问题是负边距,这似乎在两个平台上表现不同。这是人们应该期待的吗?

(而且,是的,我知道我可以在两个平台上设置不同的边距,但我想了解为什么结果与我的预期如此不同......)

这是我的代码:

import React,  Component  from 'react';
import  View, TextInput  from 'react-native';

export class Login extends Component 

    render() 
      return (
          <View style= marginLeft: 100 >
                <View style= marginTop: 25 >
                    <TextInput
                        style= color: 'black', width: 260 
                        value='email'
                    />
                    <View style= marginTop: -10,
                        borderBottomWidth: 1,
                        width: 200,
                        borderBottomColor: 'black'  />
                </View>

                <View style= marginTop: 5 >
                    <TextInput
                        style= color: 'black', width: 260 
                        value='password'
                    />
                    <View style= marginTop: -10,
                        borderBottomWidth: 1,
                        width: 200,
                        borderBottomColor: 'black'  />
                </View>
          </View>
      );
    

这就是这段代码在安卓 Galaxy S7 模拟器(左)和 iPhone 8+ 模拟器上的显示方式。

【问题讨论】:

你应该使用Platform.OS或Platform.Android来分隔它 谢谢。我知道。但我认为(1)两个平台上字段(电子邮件和密码)之间的距离应该相似,(2)下划线将在两个平台上正确显示,但它们不在 iOS 上。总而言之 - 我会理解字段上方不同的上边距,但我的问题是:为什么两个平台上的字段和下划线没有以类似的方式显示? @Yossi 我认为这只是 Apple 的垃圾“思维不同”,所以他们拒绝使用正确的 Box 模型,而是自己编造了对 Margins 的处理方式与世界其他地方不同的模型。 【参考方案1】:

我知道这不是你的问题,我看到了你的个人资料,你自己就是反应神,我非常尊重这一点哈哈

但我的问题是,为什么代码是这样的,而不是像这样的:

import React,  Component  from 'react';
import  View, TextInput  from 'react-native';

export class Login extends Component 

    render() 
      return (
          <View style= alignItems: 'center' >
                <TextInput
                    style=color: 'black', width: 260, borderBottomWidth : 4,  marginTop: 25
                    value='email'
                />
                <TextInput
                    style=color: 'black', width: 260, borderBottomWidth : 4, marginTop: 5
                    value='password'
                />
          </View>
      );
    

这段代码的工作方式是否相同?

[编辑]

另外,可能是因为 IOS 顶部和底部栏的一些问题(在较新的 iphone 上,情况并非如此)。因此,Android 的“顶部”可能与 IOS 的“顶部”不同,因为 Android 应用程序不会像 IOS 那样与顶部栏重叠。 因此,您可以进行条件检查以更改 IOS MarginTop 值,如下所示:

import React,  Component  from 'react';
import  View, TextInput, Platorm  from 'react-native';

export class Login extends Component 

    render() 
      return (
          <View style= marginLeft: 100 >
                <View style= marginTop: Platform.OS == 'android' ? 25 : 35 >
                    <TextInput
                        style= color: 'black', width: 260 
                        value='email'
                    />
                    <View style= marginTop: Platform.OS == 'android' ? -10 : -5,
                        borderBottomWidth: 1,
                        width: 200,
                        borderBottomColor: 'black'  />
                </View>

                <View style= marginTop: Platform.OS == 'android' ? 5 : 15>
                    <TextInput
                        style= color: 'black', width: 260 
                        value='password'
                    />
                    <View style= marginTop: Platform.OS == 'android' ? -10 : -5,
                        borderBottomWidth: 1,
                        width: 200,
                        borderBottomColor: 'black'  />
                </View>
          </View>
      );
    

我认为这应该可以正常工作。

【讨论】:

谢谢威廉!上帝?至少是 React 女神! :) 您的第二个示例看起来更好,但我想了解为什么我们需要在高度相似的屏幕上使用不同的 marginTop 值...【参考方案2】:

其他答案和评论很好,但他们没有回答我的问题... :) 我问为什么两个平台之间存在如此大的差异,而不是如何使用特定于平台的值进行修改。

我在这里找到了答案: react-native TextInput displays wrong when changing height on Android

引用:Android adds some default padding on top and bottom, you can reset them by adding paddingVertical: 0 to your element' style.

当指定paddingVertical: 0时,我们得到了预期的结果:

这是更新的代码:
import React,  Component  from 'react';
import  View, TextInput  from 'react-native';

export class Login extends Component 

    render() 
      return (
          <View style= marginLeft: 100 >
                <View style= marginTop: 25 >
                    <TextInput
                        style= color: 'black', width: 260, paddingVertical: 0 
                        value='email'
                    />
                    <View style= marginTop: 0,
                        borderBottomWidth: 1,
                        width: 200,
                        borderBottomColor: 'black'  />
                </View>

                <View style= marginTop: 15 >
                    <TextInput
                        style= color: 'black', width: 260, paddingVertical: 0 
                        value='password'
                    />
                    <View style= marginTop: 0,
                        borderBottomWidth: 1,
                        width: 200,
                        borderBottomColor: 'black'  />
                </View>
          </View>
      );
    

【讨论】:

以上是关于在 iOS 和 Android 中使用相同的代码但垂直边距的结果不同的 React Native 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

android studio 中存在错误,但在 flutlab.io 上工作的代码相同

在相同的代码中与 IOS 和 android 一起工作

Firebase 中 iOS 和 Android 应用的包名称相同

我可以使用与 kotlin 相同的代码库创建一个 android、ios 和 web

Flutter:在 web 、android 和 ios 中使用相同的应用程序

是否可以在 ios/android 模拟器中使用 detox 添加 cookie?