2014-02-07 10 views
15

Mein Problem ist folgendes: Immer wenn ein iPhone Benutzer angerufen wird oder sein Telefon als Hotspot benutzt, wird die iOS 7 Statusleiste vergrößert und drückt meine Die UIWebView der Phonegap-Anwendung wird unten auf dem Bildschirm angezeigt. Die vergrößerte Statusleiste wird als "In-Call-Statusleiste" bezeichnet. Siehe Bild unten:Verhindern, dass die iOS In-Call Statusleiste Phonegap UIWebView außerhalb des Bildschirms drückt

Wonky in-call status bar.

Stack-Überlauf Antworten, die ich versucht habe, dies zu beheben:

Iphone- How to resize view when call status bar is toggled?

How In-Call status bar impacts UIViewController's view size ? (and how to handle it properly)

Darüber hinaus wird es nicht scheinen, jede Art von Ereignis zu werden gefeuert durch Phonegap, die mich über die Änderung der Statusleiste informiert. Das Hören des Phonegap "pause" -Ereignisses ist nutzlos, da 1) it's known to have quirks in iOS und 2) den Hotspot-Fall nicht wirklich abdecken.

Meine Objective-C Fähigkeiten sind sehr gering, und ich greife nur diese Art von Frage zu fragen, nach dem in den erforderlichen 4+ Stunden Putting googeln, Stapel Overflowing, Heulen, etc ...

Gods of Stack-Überlauf Gib mir deine wilde Nerdwut.

+0

Es gibt ein Plugin für Cordova, mit dem Sie die IO7-Statusleiste einstellen können. Sie können es [hier] (https://github.com/jota-v/cordova-ios-statusbar) oder [hier] (https://github.com/apache/cordova-labs/tree/plugins/statusbar) bekommen) – TorchMan

+0

@ ryan-miller Welche Version der Telefonlücke verwendest du? –

+0

3.3.0 ist meine aktuelle Version. –

Antwort

9

Basierend auf den Vorschlägen von Jef kam die folgende Lösung auf. Was Sie tun möchten, ist die folgende:

  • Beachten Sie die nativen didChangeStatusBarFrame Delegierten
  • Get Größeninformationen über die Statusbar über native statusBarFrame
  • Expose Informationen zu Ihrem webview durch das Auslösen eines Ereignisses, das es passiert

Ich habe eine Github repo mit allen Code in dieser Antwort gefunden.

Setup-Benachrichtigung in AppDelegate

// Appdelegate.m 
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame 
{ 
    NSMutableDictionary *statusBarChangeInfo = [[NSMutableDictionary alloc] init]; 
    [statusBarChangeInfo setObject:@"statusbarchange" 
        forKey:@"frame"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"statusbarchange" 
             object:self 
             userInfo:statusBarChangeInfo]; 
} 

Make statusBarChange Selektor verfügbar

// MainViewController.h 
@protocol StatusBarChange <NSObject> 
    -(void)onStatusbarChange:(NSNotification*)notification; 
@end 

Richten Sie den Hörer. Dies ruft die origin und size Wörterbücher von statusBarFrame, wann immer es ändert und löst ein Ereignis in der Webansicht, die diese Daten übergeben.

// MainViewController.m 
- (void)onStatusbarChange:(NSNotification*)notification 
{ 
    // Native code for 
    NSMutableDictionary *eventInfo = [self getStatusBarInfo]; 
    [self notifiy:notification.name withInfo:eventInfo]; 
} 

- (void)notifiy:(NSString*)event withInfo:(NSMutableDictionary*)info 
{ 
    NSString *json = [self toJSON:info]; 
    NSString *cmd = [NSString stringWithFormat:@"cordova.fireWindowEvent('\%@\', %@)", event, json]; 
    [self.webView stringByEvaluatingJavaScriptFromString:cmd]; 
} 

- (NSMutableDictionary *)getStatusBarInfo 
{ 
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 

    NSMutableDictionary *statusBarInfo = [[NSMutableDictionary alloc] init]; 
    NSMutableDictionary *size = [[NSMutableDictionary alloc] init]; 
    NSMutableDictionary *origin = [[NSMutableDictionary alloc] init]; 

    size[@"height"] = [NSNumber numberWithInteger:((int) statusBarFrame.size.height)]; 
    size[@"width"] = [NSNumber numberWithInteger:((int) statusBarFrame.size.width)]; 

    origin[@"x"] = [NSNumber numberWithInteger:((int) statusBarFrame.origin.x)]; 
    origin[@"y"] = [NSNumber numberWithInteger:((int) statusBarFrame.origin.y)]; 

    statusBarInfo[@"size"] = size; 
    statusBarInfo[@"origin"] = origin; 

    return statusBarInfo; 
} 

- (NSString *) toJSON:(NSDictionary *)dictionary { 
    NSError *error; 
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error]; 
    return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

All dies ermöglicht es Ihnen, für window.statusbarchange Ereignis zu hören, zum Beispiel wie folgt:

// www/js/index.js 
window.addEventListener('statusbarchange', function(e){ 
    // Use e.size.height to adapt to the changing status bar  

}, false) 
+0

Kann dies einfach als Plugin hinzugefügt werden? Das reguläre Plugin Add funktioniert aufgrund einer fehlenden plugin.xml nicht –

1

Ich würde sagen, dass dies immer passiert, wenn Sie aus dem Hintergrund zurückkehren, nicht?

In anderen Worten ist es möglich, dass sich die Leiste vergrößert, ohne dass Ihre App durch einen eingehenden Anruf zumindest kurz in den Hintergrund gedrängt wird?

Wenn Sie so sicher sind, können Sie die Höhe der Statusleiste in Ihren Delegierten abfragen - (void) wird (orDid) fortsetzen und entsprechend anpassen?

Wenn es passiert, ohne den Vordergrund zu verlassen, die ein wenig schwieriger machen, müssen wir herausfinden, welche Benachrichtigungen zu beachten, ich weiß, gibt es eine AudioSession-Unterbrechung notif im Falle von eingehenden Anrufen, nicht sicher über die Hotspot-Sache, aber sicher gibt es eine Benachrichtigung für das auch ..

bearbeiten ok hier sind sie, wählen sie eine dieser Meldungen zu beobachten ..

UIApplicationWillChangeStatusBarFrameNotification 

UIApplicationDidChangeStatusBarFrameNotification 

Oder eine dieser Rückrufe in Ihrem Delegierten implementieren

-application:willChangeStatusBarFrame: 

-application:didChangeStatusBarFrame: