在 iOS 7.0 以上,可以手动修改应用程序的状态栏,所以这篇文章中的的方法只对 iOS7 以及更高版本有效。

iOS上状态栏就是指的最上面的20像素高的部分,状态栏分前后两部分,要分清这两个概念,后面会用到:

  • 前景部分:就是指的显示电池、时间文字的部分;
  • 背景部分:就是显示黑色或者图片的背景部分。

在这篇文章中,主要介绍在 Qt for iOS 项目中如何更改iOS的状态栏(UIStatusBar)的颜色,包括前景色和背景色。

更改状态栏背景

该方法来源自bugreports.qt.io

在 Qt 5.5 以上,对于 Widget 项目可以需要使用 Qt::MaximizeUsingFullscreenGeometryHint 属性:

setWindowFlags(windowFlags() | Qt::MaximizeUsingFullscreenGeometryHint); 

widget-ios-statusbar

但是这样应用会覆盖状态部分,可以 availableGeometry 剪裁掉状态栏的部分。

对于 QML 项目,根据上面的链接里的方法,ApplicationWindow 会自动为子控件剪裁掉状态栏部分,所以可以使用 ApplicationWindowStyle 更改背景颜色或设置背景图片,子控件(contentItem)会自动避开状态栏。

但是在实际使用中发现 ApplicationWindow 也和 QWidget 一样不能达到自动剪裁的效果。也需要自动剪裁,代码如下:

import QtQuick 2.4
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4


ApplicationWindow {
    visible: true
    flags: Qt.MaximizeUsingFullscreenGeometryHint

    style: ApplicationWindowStyle {
        background: Rectangle {
            color: "green"
        }
    }

    Rectangle {
        anchors.fill: parent
        color: "red"
        anchors.topMargin: Screen.height - Screen.desktopAvailableHeight
    }
}

效果如下图:

qml-ios-statusbar

更改状态栏前景色

相对于更改状态栏背景,更改前景色要更麻烦一些。状态栏前景色暂时只能设置两种颜色:

  • 默认的黑色(UIStatusBarStyleDefault
  • 白色(UIStatusBarStyleLightContent

可以更改状态栏前景色的地方有两个:plist文件里和程序代码里。

1.在plist中设置

在plist里增加一行 UIStatusBarStyle(或者是“Status bar style”也可以),这里可以设置两个值,就是上面提到那两个
UIStatusBarStyleDefaultUIStatusBarStyleLightContent

但是经过反复测试这种方法只能更改 App 启动时 Launch 页上状态栏前景色的颜色。

2.通过代码更改

在 Objective-C 中可以直接使用

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

或者

//相对于上面的接口,这个接口可以动画的改变statusBar的前景色 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

但是在 Qt for iOS 中如果想使用这个接口就需要 Qt 和 Objective-C 混合编程,方法来源自github,步骤如下:

  1. 在Qt Creator中添加一个 Objective-C 类 ObjectiveUtils

    • 头文件objectiveutils.h如下:
    #ifndef OBJECTIVEUTILS_H
    #define OBJECTIVEUTILS_H
    
    #include <QObject>
    
    class ObjectiveUtils : public QObject
    {
        Q_OBJECT
    
    public:
        static void setGoodStatusBarStyle();
    };
    
    #endif // OBJECTIVEUTILS_H
    • mm 文件 objectiveutils.mm 内容如下:
    #include "objectiveutils.h"
    #include <UIKit/UIKit.h>
    
    void ObjectiveUtils::setGoodStatusBarStyle()
    {
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; // white text
        //[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; // default black text
    }
  2. 在pro文件中添加如下代码:

    OBJECTIVE_SOURCES += \
    objectiveutils.mm
    
    HEADERS += \
    objectiveutils.h
  3. 在 mian.cpp 文件中使用 setGoodStatusBarStyle 方法:

    #include <QApplication>
    #include <QQmlApplicationEngine>
    #include <QQuickWindow>
    #include <QQuickView>
    #include "objectiveutils.h"
    
    int main(int argc, char *argv[])
    {
        ObjectiveUtils::setGoodStatusBarStyle();
        QApplication app(argc, argv);
        ......    
        return app.exec();
    }
  4. 最后在 Info.plist 中需要添加一行 UIViewControllerBasedStatusBarAppearance 值为 false ,原因参考ios7中UIViewControllerBasedStatusBarAppearance作用

最后状态栏前景色就是自己设置的颜色了。

参考链接:

标签: Qt for iOS, 状态栏, 颜色, UIStatusBar

添加新评论