这变成了一个巨大的冒险,随后,一个非常大和混乱的帖子,所以为了让你不必阅读我在下面放屁的混乱,这里是一个总结:

Main goal:找到一种方法,在我的应用程序中有 Select 地显示导航栏,而不必有 Select 地删除安全区域填充,以防止我的内容被iPhone X缺口截取.

Why I did it the way I did:我想try 使用导航栏内置的安全区域填充,而不是react native的<SafeAreaView>,因为<SafeAreaView>会干扰内置填充,并导致标题过高.

Side effect of not doing it the standard way:当标题和内容的 colored颜色 相同时,标题(如图中height: 0所示)和内容之间有一条模糊的线清晰可见

thin line on iPhone X simulator

What I tried:

  • 使用<SafeAreaView>
  • 不使用<SafeAreaView>,而是try 使用header: null(又名"推荐方法")
  • 播放标题选项,使标题消失,而不会导致剪辑内容.作为副作用(引自下面的扩展帖子)

    我还发现header: null在功能上与

  • borderColorborderWidth来确定它是否是边界(事后看来,我应该做得更彻底)

  • 玩"不透明"
  • position: 'relative', top: 6左右移动标题和内容
  • 在Xcode中重新创建这个问题,看看它是否是iOS问题(事后看来:我做错了)

这很清楚地引出了答案,所以我将在这里把它删掉,并在我的答案中继续.


The long, confusing, original version

我在我的react-native 项目(使用CRNA创建)中使用react-navigation ,我想我已经找到了一种方法来设置StackNavigator的标题样式,这样iOS就可以为您提供安全区域,并且不需要使用<SafeAreaView>(这会干扰其他屏幕上的标题).

我的应用程序是这样安排的,第一个屏幕有点像一个主屏幕,有一个按钮网格,最终每个按钮都有自己的页面.在这个主屏幕上,我想禁用标题栏,因为没有可导航的内容,它只是向下移动内容.然而,在其他屏幕上,我想让标题栏可见,以显示后退按钮.使用<SafeAreaView>时,我只能得到上面提到的两个屏幕中的一个,要么主屏幕被iPhone X上的凹口剪掉,要么<SafeAreaView>将其他屏幕上的导航/标题栏向下移动,占据了空间.

然而,我发现,通过完全抛弃<SafeAreaView>,我能够使用react navigation的标题样式重新创建我想要的内容:

App.js

const Navigation = createStackNavigator({
    Home: HomeScreen,
    Test: PageScreen,
},
{
  headerMode: 'screen',
  navigationOptions: {
    headerStyle: { backgroundColor: colors.background},
    headerTintColor: colors.headerTint,
    headerTitleStyle: {
      fontWeight: 'bold',
    },
  }
});

HomeScreen.js

 static navigationOptions = {
    headerStyle: {
        height: 0, 
        backgroundColor: colors.background //had to re-color it here too because otherwise the header would be white???
      },
 };

这样做效果很好,因为它可以有效地从主屏幕中删除标题,但仍然保留标题创建的安全区域填充.然而,现在有一条细线将标题与主屏幕内容分开,我不知道如何使其消失.这是唯一的东西,让我的标题欺骗和减损的用户体验.

以下是我要说的:

这不会影响我希望标题可见的其他屏幕:显然是这样, colored颜色 只是掩盖了它...

Other screens unaffected

nevermind they actually are

在使用expo测试应用程序时,这句话也出现在我的iPhone 8上,不过由于该设备上的状态栏较小,这句话没有那么低.

我已经try 过在navigationOptions中更改headerTintColor,因为我认为在我设置的headerTintColor后面可能有某种背景色,但显然它控制着文本和后退按钮的 colored颜色 .互联网似乎也没有太多关于这一点的信息,我可以立即告诉大家,搜索header line react-navigation会得到关于隐藏标题、无法隐藏标题以及如何自定义标题的结果.Does anyone know what this line is and how I remove it?或失败,如何使<SafeAreaView>发挥良好的StackNavigator的导航标题?

EDIT:我也try 过header: null,解决方案,但是,通过删除应用程序主页上的标题,而不是其他导致<SafeAreaView>产生奇怪的副作用,<SafeAreaView>的安全区域添加到已经内置到iOS标题中的安全区域,导致标题比应该的大得多,这就是为什么我 Select 了height: 0,因为它使标题实际上不可见,但仍然保持它的安全区域.

EDIT 2:在玩了头球的borderColorborderWidth之后,我确定这条线不是边界...

headerStyle: {
        height: 400,
        backgroundColor: 'green',
        borderColor: 'red',
        borderWidth: 150,
      },

Result of code above

EDIT 3:更多发现.在使用CSS后,我发现设置opacity: 0会在导航栏后面显示一个白色层...也许这比导航栏本身大一点?

而且,header: nullheaderTransparent: 'true'在功能上是一样的,我后来发现,它和display: 'none'在功能上也是一样的.所有这些似乎都是使整个标题、安全区域填充和所有内容消失的有效方法.

将其改为position: 'relative', top: 6似乎也无法解决这个问题

EDIT 4:

EDIT 4a:为了证实这个理论,我创建了一个纯本地的xcode项目,并试图通过将导航栏和视图设置为黑色来重新创建这个项目,与我的预期相反,这个问题并没有重新生成.所以这确实是react native创建的东西,没有内置到iOS中我再次站出来更正...How to remove navigation bar border/shadow?

screenshot

推荐答案

从问题开头的总结继续...

当我意识到我的Xcode测试有缺陷时,我就开始用谷歌搜索StackOverflow上仅限iOS的帖子,发现同样的问题:

因为这些都是iOS原生解决方案,所以我开始寻找在react中重新创建它们的方法.这让我开始寻找同样的iOS唯一问题,但在找到解决方案时使用了react关键字:

How do I hide the shadow under react-navigation headers?

虽然这个问题似乎针对android,但答案也提到了iOS:

elevation: 0, // remove shadow on Android shadowOpacity: 0, // remove shadow on iOS

资料来源:https://stackoverflow.com/a/42709731

我试过了.没用.

然后再往下an answer说:

headerStyle: { elevation: 0, shadowOpacity: 0, borderBottomWidth: 0, }

试过了:成功了.


TL;DR

如果想在react native的现代版本中使用StackNavigator而不必使用<SafeAreaView>时隐藏标题,请在createStackNavigator({...})或屏幕类的static navigationOptions = {...}中使用以下代码:

headerStyle: {
        backgroundColor: colors.background,
        borderBottomWidth: 0,
        height: 0,
    },

React-native相关问答推荐

REACT-Native-Render-html中所有文本的默认字体大小

如何在EXPO路由中重置导航

在原生react 中更改图像源URI时闪烁

React Native在同一页面上使用多个不同的导航器

我们如何才能将我们自己的应用程序(IOS)排除在共享表中?

使用react native 杀死应用程序后蓝牙仍处于活动状态

react-native 根据状态隐藏显示按钮

react native HTML entities

React Native WebView onMessage 没有做任何事情

可能的未处理promise 拒绝(id:0):错误: "getLoginData" is read-only

React-native -run-ios 错误无法构建 iOS 元素.我们运行了xcodebuild命令,但它以错误代码 65 退出

错误:看起来您在另一个中嵌套了一个NavigationContainer

React Native 无法读取 index.android.delta

React-Native Packager 失败:重复的模块名称

是否可以将 Image.getSize 与静态图像文件一起使用?

React Native 检测点击 View

是否可以在 react-native 的构造函数中调用异步函数?

我们可以在 react webapp 和 react native 应用程序之间共享代码吗,并且可以在 react-native 生产环境中使用

react-native构建错误:package android.support.annotation does not exist

无法读取未定义的属性 string| React.PropTypes | LayoutPropTypes.js