From 9c9a8ba983a8963a17c5f878e876e5956e1e3751 Mon Sep 17 00:00:00 2001 From: Shazron Abdullah Date: Tue, 15 Oct 2013 14:12:41 -0700 Subject: [PATCH] StatusBar - remove dependence of UIViewControllerBasedStatusBarAppearance Info.plist key --- README.md | 7 --- plugin.xml | 12 ---- src/ios/CDVStatusBar.h | 2 + src/ios/CDVStatusBar.m | 123 +++++++++++++++++++++++++++++++++++------ 4 files changed, 107 insertions(+), 37 deletions(-) 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];