diff --git a/src/ios/CDVStatusBar.h b/src/ios/CDVStatusBar.h index df48d2d..84f37fa 100644 --- a/src/ios/CDVStatusBar.h +++ b/src/ios/CDVStatusBar.h @@ -23,12 +23,10 @@ @interface CDVStatusBar : CDVPlugin { @protected BOOL _statusBarOverlaysWebView; - @protected UIView* _statusBarBackgroundView; - @protected BOOL _uiviewControllerBasedStatusBarAppearance; - @protected UIColor* _statusBarBackgroundColor; + NSString* _eventsCallbackId; } @property (atomic, assign) BOOL statusBarOverlaysWebView; diff --git a/src/ios/CDVStatusBar.m b/src/ios/CDVStatusBar.m index 98f2285..8b6666e 100644 --- a/src/ios/CDVStatusBar.m +++ b/src/ios/CDVStatusBar.m @@ -70,8 +70,9 @@ static const void *kStatusBarStyle = &kStatusBarStyle; @end -@interface CDVStatusBar () < - UIScrollViewDelegate> +@interface CDVStatusBar () +- (void)fireTappedEvent; +- (void)updateIsVisible:(BOOL)visible; @end @implementation CDVStatusBar @@ -85,9 +86,7 @@ static const void *kStatusBarStyle = &kStatusBarStyle; { if ([keyPath isEqual:@"statusBarHidden"]) { NSNumber* newValue = [change objectForKey:NSKeyValueChangeNewKey]; - BOOL boolValue = [newValue boolValue]; - - [self.commandDelegate evalJs:[NSString stringWithFormat:@"StatusBar.isVisible = %@;", boolValue? @"false" : @"true" ]]; + [self updateIsVisible:![newValue boolValue]]; } } @@ -136,10 +135,34 @@ static const void *kStatusBarStyle = &kStatusBarStyle; fakeScrollView.contentOffset = CGPointMake(0.0f, UIScreen.mainScreen.bounds.size.height); // Scroll down so a tap will take scroll view back to the top } +- (void)onReset { + _eventsCallbackId = nil; +} + +- (void)fireTappedEvent { + if (_eventsCallbackId == nil) { + return; + } + NSDictionary* payload = @{@"type": @"tap"}; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:payload]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:_eventsCallbackId]; +} + +- (void)updateIsVisible:(BOOL)visible { + if (_eventsCallbackId == nil) { + return; + } + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:visible]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:_eventsCallbackId]; +} + + - (void) _ready:(CDVInvokedUrlCommand*)command { - // set the initial value - [self.commandDelegate evalJs:[NSString stringWithFormat:@"StatusBar.isVisible = %@;", [UIApplication sharedApplication].statusBarHidden? @"false" : @"true" ]]; + _eventsCallbackId = command.callbackId; + [self updateIsVisible:![UIApplication sharedApplication].statusBarHidden]; } - (void) initializeStatusBarBackgroundView @@ -429,7 +452,7 @@ static const void *kStatusBarStyle = &kStatusBarStyle; - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView { - [self.webView stringByEvaluatingJavaScriptFromString:@"var evt = document.createEvent(\"Event\"); evt.initEvent(\"statusTap\",true,true); window.dispatchEvent(evt);"]; + [self fireTappedEvent]; return NO; } diff --git a/www/statusbar.js b/www/statusbar.js index 53e89fd..63967a9 100644 --- a/www/statusbar.js +++ b/www/statusbar.js @@ -97,7 +97,13 @@ var StatusBar = { // prime it exec(function (res) { - StatusBar.isVisible = res; + if (typeof res == 'object') { + if (res.type == 'tap') { + cordova.fireWindowEvent('statusTap'); + } + } else { + StatusBar.isVisible = res; + } }, null, "StatusBar", "_ready", []); module.exports = StatusBar;