Changing Status Bar Style in iOS
NativeScript allows you to build multi-platform applications by exposing a rich common API. You don't need to know specifics of the different platforms, however, every platform has its own features. In those cases when you need to fine tune your application and make it look more native, NativeScrpt gives you full control and access to the native API and platform-specific functionality. One such scenario is when you want to change the status bar style in iOS.
There are two options to change the status bar style for iOS applications in NativeScript.
- By changing the
NavigationBar
style. - By using the
Info.plist
file.
Changing the status bar style using the NavigationBar barStyle property
This method is easier, but it implies using an
ActionBar
. The NativeScript
ActionBar
is a common abstraction over iOS
UINavigationBar
and Android's
ActionBar
. It is a bar typically located at the top
of the screen and it provides title and navigation control in
your application.
-
Use the page's XML file to declare an
ActionBar
in your application.
Example 1: How to create default
ActionBar
with title<Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="loaded"> <Page.actionBar> <ActionBar title="Sample title"></ActionBar> </Page.actionBar> </Page>
Figure 1 shows the result of adding the sample code from Example 1.
Figure 1: Default style of ActionBar
It is easy to change the background color of the
UINavigationBar
and the status bar, respectively.
To do this you should set the
backgroundColor
property of the
ActionBar
. This can be done in XML or with CSS.
Example 2:How to set up
ActionBar
backgroundColor property<Page.actionBar> <ActionBar title="Sample title" backgroundColor="green"></ActionBar> </Page.actionBar>
ActionBar { background-color: green; }
Figure 2 shows the result.
Figure 2: Changed background color of NavigationBar and StatusBar
In iOS there are two possible styles that you could set to the
UINavigationBar
: Default
and
Black
. Changing the
UINavigationBar
style will change the style of the
status bar automatically. By default, the
UINavigationBar
style in iOS is
Default
, which means that the letters will be black
and the background color will be white.
- Changing the style of UINavigationBar
You should use the frame
module to access the
native instance of UINavigationBar
. Then you can
use its barStyle
property to change its style to
Black
.
Example 3: How to change UINavigationBar style using native code
var frame = require("tns-core-modules/ui/frame");
var platform = require("tns-core-modules/platform");
function loaded(args) {
if (platform.isIOS) {
var navigationBar = frame.topmost().ios.controller.navigationBar;
navigationBar.barStyle = UIBarStyle.Black;
}
}
exports.loaded = loaded;
import { EventData } from "tns-core-modules/data/observable";
import { topmost } from "tns-core-modules/ui/frame";
import { isIOS } from "tns-core-modules/platform";
export function loaded(args: EventData){
if (isIOS) {
let navigationBar = topmost().ios.controller.navigationBar;
navigationBar.barStyle = UIBarStyle.Black;
}
}
Figure 3 shows the result.
Figure 3: Changing the default UINavigationBar style to Black
As Figure 3 shows, the style of
UINavigationBar
and status bar have been changed to
a gray background color and white text and icons.
Changing status bar style only
You should use this option in scenarios when you don't want to
use ActionBar
. In iOS, the status bar has two style
types: the default one -
UIStatusBarStyleDefault
and
UIStatusBarStyleLightContent
. The default style
looks like Figure 4: icons with black color and
white background color.
Figure 4: Default StatusBar style
You can use the application's Info.plist file to change the status bar style:
-
Go to the
app/App_Resources/iOS
folder. -
Open the
Info.plist
file. -
Add the code shown below in your
Info.plist
before closing</dict>
tag
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
As a result, your Info.plist
should look like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>icon.png</string>
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>icon-40</string>
<string>icon-60</string>
<string>icon-72</string>
<string>icon-76</string>
<string>Icon-Small</string>
<string>Icon-Small-50</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
Which you can see in Figure 5.
Figure 5: Changed StatusBar style to
UIStatusBarStyleLightContent
Now in place of the status bar we can see one white line. That
happened because we changed the color of the icon to white;
however, the background color is the same as the icon. To fix
this we should set the page's
backgroundColor
property. You should also set the
backgroundSpanUnderStatusBar
property to
true
. This will span the background color under the
status bar:
Example 5: How to span the background color under the status bar
<Page xmlns="http://schemas.nativescript.org/tns.xsd" backgroundSpanUnderStatusBar="true" backgroundColor="red">
<StackLayout>
<Label text="Tap the button" class="title"/>
<Button text="TAP" tap="" />
<Label text="" class="message" textWrap="true"/>
</StackLayout>
</Page>
Figure 6 shows the result:
Figure 6: Changed background color of status bar
The sample projects for both cases are available in these GitHub repositories: StyleStatusBariOSviaActionBar and StyleStatusBariOSviaInfo.plist