diff --git a/README.md b/README.md
index 4ca7022..ca63865 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,6 @@ StatusBar
> The `StatusBar` object provides some functions to customize the iOS StatusBar.
The plugin reads the __StatusBarOverlaysWebView__ (boolean, defaults to true) and __StatusBarBackgroundColor__ (color hex string, defaults to #000000) values from config.xml.
-
-For iOS 7, to use the statusbar style functions, you need the addition of a key in your Info.plist. See the Permissions section below.
Methods
-------
@@ -34,11 +32,6 @@ Permissions
-#### [ProjectName]-Info.plist
-
- UIViewControllerBasedStatusBarAppearance
-
-
StatusBar.overlaysWebView
=================
diff --git a/plugin.xml b/plugin.xml
index 13f2115..e315732 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -28,21 +28,9 @@
-
-
-
-Add this key and value to your project's Info.plist:
- <key>UIViewControllerBasedStatusBarAppearance</key>
- <false/>
-
diff --git a/src/ios/CDVStatusBar.h b/src/ios/CDVStatusBar.h
index a059e5c..2bf5d26 100644
--- a/src/ios/CDVStatusBar.h
+++ b/src/ios/CDVStatusBar.h
@@ -25,6 +25,8 @@
BOOL _statusBarOverlaysWebView;
@protected
UIView* _statusBarBackgroundView;
+ @protected
+ BOOL _uiviewControllerBasedStatusBarAppearance;
}
@property (atomic, assign) BOOL statusBarOverlaysWebView;
diff --git a/src/ios/CDVStatusBar.m b/src/ios/CDVStatusBar.m
index 4a6efec..25c70f8 100644
--- a/src/ios/CDVStatusBar.m
+++ b/src/ios/CDVStatusBar.m
@@ -24,6 +24,51 @@
*/
#import "CDVStatusBar.h"
+#import
+#import
+
+static const void *kHideStatusBar = &kHideStatusBar;
+static const void *kStatusBarStyle = &kStatusBarStyle;
+
+@interface CDVViewController (StatusBar)
+
+@property (nonatomic, retain) id sb_hideStatusBar;
+@property (nonatomic, retain) id sb_statusBarStyle;
+
+@end
+
+@implementation CDVViewController (StatusBar)
+
+@dynamic sb_hideStatusBar;
+@dynamic sb_statusBarStyle;
+
+- (id)sb_hideStatusBar {
+ return objc_getAssociatedObject(self, kHideStatusBar);
+}
+
+- (void)setSb_hideStatusBar:(id)newHideStatusBar {
+ objc_setAssociatedObject(self, kHideStatusBar, newHideStatusBar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+- (id)sb_statusBarStyle {
+ return objc_getAssociatedObject(self, kStatusBarStyle);
+}
+
+- (void)setSb_statusBarStyle:(id)newStatusBarStyle {
+ objc_setAssociatedObject(self, kStatusBarStyle, newStatusBarStyle, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+}
+
+- (BOOL) prefersStatusBarHidden {
+ return [self.sb_hideStatusBar boolValue];
+}
+
+- (UIStatusBarStyle)preferredStatusBarStyle
+{
+ return (UIStatusBarStyle)[self.sb_statusBarStyle intValue];
+}
+
+@end
+
@implementation CDVStatusBar
@@ -32,14 +77,6 @@
return [self.commandDelegate.settings objectForKey:[key lowercaseString]];
}
-- (void) checkInfoPlistKey
-{
- NSNumber* uiviewControllerBasedStatusBarAppearance = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"];
- if (uiviewControllerBasedStatusBarAppearance == nil || [uiviewControllerBasedStatusBarAppearance boolValue]) {
- NSLog(@"ERROR: To use the statusbar plugin, in your app's Info.plist, you need to add a 'UIViewControllerBasedStatusBarAppearance' key with a value of ");
- }
-}
-
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
if ([keyPath isEqual:@"statusBarHidden"]) {
@@ -52,6 +89,12 @@
- (void)pluginInitialize
{
+ BOOL isiOS7 = (IsAtLeastiOSVersion(@"7.0"));
+
+ // init
+ NSNumber* uiviewControllerBasedStatusBarAppearance = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"];
+ _uiviewControllerBasedStatusBarAppearance = (uiviewControllerBasedStatusBarAppearance == nil || [uiviewControllerBasedStatusBarAppearance boolValue]) && isiOS7;
+
// observe the statusBarHidden property
[[UIApplication sharedApplication] addObserver:self forKeyPath:@"statusBarHidden" options:NSKeyValueObservingOptionNew context:NULL];
@@ -126,6 +169,29 @@
self.statusBarOverlaysWebView = [value boolValue];
}
+- (void) refreshStatusBarAppearance
+{
+ SEL sel = NSSelectorFromString(@"setNeedsStatusBarAppearanceUpdate");
+ if ([self.viewController respondsToSelector:sel]) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+ [self.viewController performSelector:sel withObject:nil];
+#pragma clang diagnostic pop
+ }
+}
+
+- (void) setStyleForStatusBar:(UIStatusBarStyle)style
+{
+ if (_uiviewControllerBasedStatusBarAppearance) {
+ CDVViewController* vc = (CDVViewController*)self.viewController;
+ vc.sb_statusBarStyle = [NSNumber numberWithInt:style];
+ [self refreshStatusBarAppearance];
+
+ } else {
+ [[UIApplication sharedApplication] setStatusBarStyle:style];
+ }
+}
+
- (void) setStatusBarStyle:(NSString*)statusBarStyle
{
// default, lightContent, blackTranslucent, blackOpaque
@@ -144,26 +210,22 @@
- (void) styleDefault:(CDVInvokedUrlCommand*)command
{
- [self checkInfoPlistKey];
- [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
+ [self setStyleForStatusBar:UIStatusBarStyleDefault];
}
- (void) styleLightContent:(CDVInvokedUrlCommand*)command
{
- [self checkInfoPlistKey];
- [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
+ [self setStyleForStatusBar:UIStatusBarStyleLightContent];
}
- (void) styleBlackTranslucent:(CDVInvokedUrlCommand*)command
{
- [self checkInfoPlistKey];
- [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent];
+ [self setStyleForStatusBar:UIStatusBarStyleBlackTranslucent];
}
- (void) styleBlackOpaque:(CDVInvokedUrlCommand*)command
{
- [self checkInfoPlistKey];
- [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
+ [self setStyleForStatusBar:UIStatusBarStyleBlackOpaque];
}
- (void) backgroundColorByName:(CDVInvokedUrlCommand*)command
@@ -202,6 +264,19 @@
[self _backgroundColorByHexString:value];
}
+
+- (void) hideStatusBar
+{
+ if (_uiviewControllerBasedStatusBarAppearance) {
+ CDVViewController* vc = (CDVViewController*)self.viewController;
+ vc.sb_hideStatusBar = [NSNumber numberWithBool:YES];
+ [self refreshStatusBarAppearance];
+
+ } else {
+ UIApplication* app = [UIApplication sharedApplication];
+ [app setStatusBarHidden:YES];
+ }
+}
- (void) hide:(CDVInvokedUrlCommand*)command
{
@@ -210,7 +285,7 @@
if (!app.isStatusBarHidden)
{
self.viewController.wantsFullScreenLayout = YES;
- [app setStatusBarHidden:YES];
+ [self hideStatusBar];
if (IsAtLeastiOSVersion(@"7.0")) {
[_statusBarBackgroundView removeFromSuperview];
@@ -220,7 +295,19 @@
self.viewController.view.frame = bounds;
self.webView.frame = bounds;
+ }
+}
+
+- (void) showStatusBar
+{
+ if (_uiviewControllerBasedStatusBarAppearance) {
+ CDVViewController* vc = (CDVViewController*)self.viewController;
+ vc.sb_hideStatusBar = [NSNumber numberWithBool:NO];
+ [self refreshStatusBarAppearance];
+ } else {
+ UIApplication* app = [UIApplication sharedApplication];
+ [app setStatusBarHidden:NO];
}
}
@@ -233,7 +320,7 @@
BOOL isIOS7 = (IsAtLeastiOSVersion(@"7.0"));
self.viewController.wantsFullScreenLayout = isIOS7;
- [app setStatusBarHidden:NO];
+ [self showStatusBar];
if (isIOS7) {
CGRect bounds = [[UIScreen mainScreen] bounds];