NativeScript 中的状态栏样式

Posted

技术标签:

【中文标题】NativeScript 中的状态栏样式【英文标题】:Status bar style in NativeScript 【发布时间】:2020-01-09 05:58:39 【问题描述】:

我正在尝试在此处重现第一页上看到的效果:https://github.com/sebawita/starships,其中有一个状态栏,内容很轻,没有操作栏。

我一直在尝试此处指定的说明:https://github.com/NativeScript/nativescript-angular/issues/1779#issuecomment-522586849

我正在使用 NativeScript Vue 而不是 Angular,但我认为这并不重要。这是我的组件代码:

<template>
    <Page
        class="page"
        ref="page"
        statusBarStyle="light"
        @loaded="onPageLoaded()">
        <GridLayout rows="*, 60, 60, 20, 60, *">
            <Label row="0" textWrap="true" class="header" text="Starship Service" />
            <TextField
                id="emailField"
                hint="Email"
                keyboardType="email"
                returnKeyType="next"
                autocorrect="false"
                row="1"
                class="textfield"
                ios.clearButtonMode="1"
                ref="field1" />

            <TextField
                row="2"
                secure="true"
                hint="Password"
                returnKeyType="send"
                class="textfield" />
            <Button row="4" text="Log in" />
        </GridLayout>
    </Page>
</template>
<script>
import  topmost  from "tns-core-modules/ui/frame";
import  isIOS  from "tns-core-modules/platform";

export default 
    methods: 
        onPageLoaded: function(args) 
            console.log('page loaded');

            if (isIOS) 
                Object.defineProperty(UIViewController.prototype, 'preferredStatusBarStyle', 
                    get: function () 
                        return this._preferredStatusBarStyle || UIStatusBarStyle.Default;
                    ,
                    enumerable: true,
                    configurable: true
                );
                let controller = topmost().ios.controller;
                controller._preferredStatusBarStyle = UIStatusBarStyle.Default;
                controller.setNeedsStatusBarAppearanceUpdate();
            

            console.log("page loaded done");
        ,
    ,
    computed: 
        message() 
            return "Welcome to the first version of the starship app :-)";
        
    
;
</script>
<style scoped lang="scss">
    .page 
        background-image: url("https://raw.githubusercontent.com/sebawita/starships/master/icons/space-bg.jpg?raw=true");
        color: #fff; 
    
</style>

我的Info.plist 文件中有这个:

    <key>UIStatusBarStyle</key>
    <string>UIStatusBarStyleLightContent</string>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>

【问题讨论】:

您应该将UIViewControllerBasedStatusBarAppearance 设置为true,因为您想更改每个控制器的状态栏外观。 好点。然而,不幸的是,将&lt;false/&gt; 更改为&lt;true/&gt; 似乎并没有改变任何东西。 【参考方案1】:

您可以在页面加载事件上原生设置状态栏样式

HTML

<Page class="page" @loaded="onPageLoaded">

JS

onPageLoaded: function(args) 
  let controller = args.object.frame.ios.controller;
  controller.navigationBar.barStyle = 0; // `0` for Black or `1` for Light

【讨论】:

感谢您的贡献。如果我有操作栏,该方法对我有用。但是,如果我删除操作栏,则不会。这一发现与此处的文档一致:docs.nativescript.org/ui/change-status-bar-style-ios. 如果您正在寻找快速解决方案,您可以将基于视图控制器的外观设置为 false,并在加载页面时在共享应用程序实例上设置 stausbar 样式。【参考方案2】:

您还可以隐藏每个组件的操作栏。

import  Page  from 'tns-core-modules/ui/page/page';

constructor(
      private page: Page) 
      page.actionBarHidden = true;

【讨论】:

不幸的是,如果操作栏被隐藏,则无法以编程方式设置状态栏样式。我可以给它一个零高度,但这会带来一系列问题(请参阅 github 问题跟踪器链接)。【参考方案3】:

就像在另一条评论中得到回答一样,您需要确保您的 Info.plist 文件有这个条目:

<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

在 NativeScript 6.4 或 6.5 中添加了所需的关键代码: https://github.com/NativeScript/NativeScript/pull/8241/files

这是 NativeScript Page 对象上的 iOS preferredStatusBarStyle() 函数。 NativeScript-Vue 将其作为一个 prop 公开,您可以将 'light' 或 'dark' 值传递给它。查看更新后的Vue documentation。

【讨论】:

以上是关于NativeScript 中的状态栏样式的主要内容,如果未能解决你的问题,请参考以下文章

android中状态栏下的nativescript操作栏

尝试更改状态栏样式在 ios 中给了我错误 - React native

Nativescript - 在 Android 中隐藏状态栏

React Native中状态栏设置StatusBar

我的用例中的 Nativescript 或 Native

React Native 中的状态栏颜色