2016-08-26 2 views
-1



dies eine andere Frage ist aber immer noch in Bezug auf mein ursprüngliches Problem ist:
Is there an elegant way to access the camera from the inappbrowser under iOS?
tl; dr: Ich habe die cordova Kamera-Plugin auf dem inappbrowser öffnen möge plugin (view hierarchy problem)

Nachdem mein erster Ansatz (alte Frage) mich nirgendwohin geführt hat, habe ich versucht das zu modifizieren. Ich wollte es ein Subview der cordova Ansicht sein, die den folgenden Code zu erreichen verwaltet:
Ich brauche Hilfe die InAppBrowser in nativen Code zu modifizieren

__weak CDVInAppBrowser* weakSelf = self; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    if (weakSelf.inAppBrowserViewController != nil) { 
     //[weakSelf.viewController presentViewController:nav animated:YES completion:nil]; 
     [self.viewController.view addSubview:self.inAppBrowserViewController.view]; 
    } 
}); 

Zum Schließen des inappbrowser ich meine modifizierten schließen Methode verwenden:

- (void)close:(CDVInvokedUrlCommand*)command 
{ 
    if (self.inAppBrowserViewController != nil) { 
     UIView *lastView; 
     for(UIView *subview in [self.viewController.view subviews]) { 
      lastView = subview; 
     } 
     [lastView removeFromSuperview];  

     if (self.callbackId != nil) { 
      CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK 
                 messageAsDictionary:@{@"type":@"exit"}]; 
      [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId]; 
     } 

     self.inAppBrowserViewController.navigationDelegate = nil; 
     self.inAppBrowserViewController = nil; 
     _previousStatusBarStyle = -1; 
    } 
} 

Bitte beachten dass ich keine Erfahrung in Ziel c habe und nicht wirklich weiß, was ich tue, werde ich für Hinweise dankbar sein.

Beide Modifikationen funktionieren wie erwartet, ich bin in der Lage, das Kamera-Plugin oben auf dem inappbrowser zu zeigen und das Bild dazu zu bekommen und auch das exit Ereignis des Plugins beim Schließen auszulösen.

Folgende Aufgaben arbeiten jetzt:

  • offen inappbrowser
  • Auslöser Kamera von inappbrowser
  • Bild erhalten
  • schließen inappbrowser

ABER wenn ich will inappbrowser die öffnen inappbrowser erneut (ohne die App neu zu starten), öffnet sich die Subview, zeigt aber nichts, nur eine leere Seite. Es funktioniert wieder, wenn ich die App neu starte, aber jedes Mal, wenn der inappbrowser nach dem Schließen der App geöffnet wird, wird nur ein leerer Bildschirm angezeigt.
Ich vermute, dass es einige Reste des inappbrowser gibt, die die Ursache des Problems sind.
Ich sehe zwei mögliche Lösungen hier:

  • alles löschen Sie die inappbrowser concernig beim Schließen
  • die inappbrowser neu initialisiert alles überschreiben auf jeden

beginne ich weiß nicht, wie entweder implemet.
Kann mir bitte jemand helfen oder in die allgemeine Richtung einer möglichen Lösung zeigen.

ps. .: Ich weiß, dass dies nicht das beabsichtigte Verhalten des inappbrowsers ist, da es Aufrufe an die native API unmöglich machen will, aber ich brauche es so. Iframes oder Schließen des Inappbrowsers, um die Kamera zu bekommen, ist keine Option.

+0

Denke nicht, dass das möglich ist. Und wie Sie sagten, "nicht das beabsichtigte Verhalten des InAppBrowser". Ich würde davon abraten, dies zu tun ... Warum können Sie die Seite, die Sie mit InAppBrowser öffnen, nicht in Ihre App aufnehmen? – johnborges

+0

Kudos für das Denken außerhalb der Box! Während ich keine Zeit damit verbracht habe, über Ihren Anwendungsfall nachzudenken, ist es sehr möglich, den IAB zu erweitern und zu modifizieren, um alle möglichen coolen Dinge zu tun. Ich habe festgestellt, dass das Hinzufügen anderer Plugins, auf die direkt über die IAB-Symbolleiste zugegriffen werden kann (z. B. neben der Schaltfläche "Fertig"), sehr einfach und elegant ist. Ich habe dort Share-, Print- und andere Funktionen implementiert, sowohl in iOS als auch in Android, ohne große Bedenken. Das Problem mit der Ansichtshierarchie, das Sie entdeckt haben, führt Sie möglicherweise dazu, die schlecht implementierten SplashImage-Komponenten zu "reparieren", was sich negativ auf den View-Stack auswirkt ... – gro

+0

... Wenn Sie etwas ausschneiden oder es komplett ersetzen, in der Kamera-Plugin. Du wirst es herausfinden, da du schon ziemlich weit gekommen bist. – gro

Antwort

2

Ich habe es herausgefunden! Sie haben die Show-Methode von CDVInAppBrowser zu ändern:

dispatch_async(dispatch_get_main_queue(), ^{ 
    if (weakSelf.inAppBrowserViewController != nil) { 
     //[weakSelf.viewController presentViewController:nav animated:YES completion:nil]; 
     self.inAppBrowserViewController.view.frame = CGRectMake(0,20,self.inAppBrowserViewController.view.frame.size.width,self.inAppBrowserViewController.view.frame.size.height-20);    
     [self.viewController.view addSubview:self.inAppBrowserViewController.view]; 
    } 
}); 

einfach die Kommentarzeile entfernen und die 2 nach der Kommentarzeile hinzufügen.In der Nähe Methode von CDVInAppBrowser muss man hinzufügen:

UIView *lastView; 
for(UIView *subview in [self.viewController.view subviews]) { 
    lastView = subview; 
} 
[lastView removeFromSuperview]; 

Recht vor [self.inAppBrowserViewController close];.
Fertig, die Kamera öffnet sich nun über dem inappbrowser und übergibt das Bild an sie.

+0

Behoben für mich! –

Verwandte Themen