You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2013/10/15 23:12:58 UTC
git commit: StatusBar - remove dependence of
UIViewControllerBasedStatusBarAppearance Info.plist key
Updated Branches:
refs/heads/plugins c6f64abbb -> 383dbba50
StatusBar - remove dependence of UIViewControllerBasedStatusBarAppearance Info.plist key
Project: http://git-wip-us.apache.org/repos/asf/cordova-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-labs/commit/383dbba5
Tree: http://git-wip-us.apache.org/repos/asf/cordova-labs/tree/383dbba5
Diff: http://git-wip-us.apache.org/repos/asf/cordova-labs/diff/383dbba5
Branch: refs/heads/plugins
Commit: 383dbba509383cc2f1deac27d7060f66f3ce3119
Parents: c6f64ab
Author: Shazron Abdullah <sh...@apache.org>
Authored: Tue Oct 15 14:12:41 2013 -0700
Committer: Shazron Abdullah <sh...@apache.org>
Committed: Tue Oct 15 14:12:55 2013 -0700
----------------------------------------------------------------------
statusbar/README.md | 7 --
statusbar/plugin.xml | 12 ----
statusbar/src/ios/CDVStatusBar.h | 2 +
statusbar/src/ios/CDVStatusBar.m | 123 +++++++++++++++++++++++++++++-----
4 files changed, 107 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/383dbba5/statusbar/README.md
----------------------------------------------------------------------
diff --git a/statusbar/README.md b/statusbar/README.md
index 4ca7022..ca63865 100644
--- a/statusbar/README.md
+++ b/statusbar/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
<param name="ios-package" value="CDVStatusBar" onload="true" />
</feature>
-#### [ProjectName]-Info.plist
-
- <key>UIViewControllerBasedStatusBarAppearance</key>
- <false/>
-
StatusBar.overlaysWebView
=================
http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/383dbba5/statusbar/plugin.xml
----------------------------------------------------------------------
diff --git a/statusbar/plugin.xml b/statusbar/plugin.xml
index 13f2115..e315732 100644
--- a/statusbar/plugin.xml
+++ b/statusbar/plugin.xml
@@ -28,21 +28,9 @@
<preference name="StatusBarBackgroundColor" value="#000000" />
</config-file>
- <!-- add this manually for now, crash bug - see https://issues.apache.org/jira/browse/CB-5012
- <config-file target="*-Info.plist" parent="UIViewControllerBasedStatusBarAppearance" >
- <key>UIViewControllerBasedStatusBarAppearance</key>
- <false/>
- </config-file>
- -->
-
<header-file src="src/ios/CDVStatusBar.h" />
<source-file src="src/ios/CDVStatusBar.m" />
- <info>
-Add this key and value to your project's Info.plist:
- <key>UIViewControllerBasedStatusBarAppearance</key>
- <false/>
- </info>
</platform>
</plugin>
http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/383dbba5/statusbar/src/ios/CDVStatusBar.h
----------------------------------------------------------------------
diff --git a/statusbar/src/ios/CDVStatusBar.h b/statusbar/src/ios/CDVStatusBar.h
index a059e5c..2bf5d26 100644
--- a/statusbar/src/ios/CDVStatusBar.h
+++ b/statusbar/src/ios/CDVStatusBar.h
@@ -25,6 +25,8 @@
BOOL _statusBarOverlaysWebView;
@protected
UIView* _statusBarBackgroundView;
+ @protected
+ BOOL _uiviewControllerBasedStatusBarAppearance;
}
@property (atomic, assign) BOOL statusBarOverlaysWebView;
http://git-wip-us.apache.org/repos/asf/cordova-labs/blob/383dbba5/statusbar/src/ios/CDVStatusBar.m
----------------------------------------------------------------------
diff --git a/statusbar/src/ios/CDVStatusBar.m b/statusbar/src/ios/CDVStatusBar.m
index 4a6efec..25c70f8 100644
--- a/statusbar/src/ios/CDVStatusBar.m
+++ b/statusbar/src/ios/CDVStatusBar.m
@@ -24,20 +24,57 @@
*/
#import "CDVStatusBar.h"
+#import <objc/runtime.h>
+#import <Cordova/CDVViewController.h>
-@implementation CDVStatusBar
+static const void *kHideStatusBar = &kHideStatusBar;
+static const void *kStatusBarStyle = &kStatusBarStyle;
-- (id)settingForKey:(NSString*)key
+@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 [self.commandDelegate.settings objectForKey:[key lowercaseString]];
+ return (UIStatusBarStyle)[self.sb_statusBarStyle intValue];
}
+
+@end
-- (void) checkInfoPlistKey
+
+@implementation CDVStatusBar
+
+- (id)settingForKey:(NSString*)key
{
- 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 <false/>");
- }
+ return [self.commandDelegate.settings objectForKey:[key lowercaseString]];
}
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
@@ -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];