2016-08-26 2 views
-1



ceci est une autre question, mais est toujours au sujet de mon problème d'origine:
Is there an elegant way to access the camera from the inappbrowser under iOS?
tl; dr: Je veux ouvrir le plugin caméra cordova au-dessus de la inappbrowser plugin (voir problème de hiérarchie)

Après ma première approche (ancienne question) ne m'a pas conduit n'importe où, j'ai essayé de modifier le inappbrowser (gitlink). Je voulais que ce soit une sous-vue de la vue cordova, que le code suivant a réussi à accomplir:
je besoin d'aide pour modifier le InAppBrowser en code natif

__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]; 
    } 
}); 

Pour fermer la inappbrowser utiliser ma méthode close modifiée:

- (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; 
    } 
} 

S'il vous plaît garder à l'esprit que je n'ai aucune expérience dans l'objectif c et que je ne sais pas vraiment ce que je fais, je serai reconnaissant pour tous les conseils.

Les deux modifications fonctionnent comme prévu, je suis en mesure d'afficher le plugin de la caméra sur le dessus de l'inappbrowser et de l'image et de déclencher l'événement exit du plugin à la fermeture.

Les tâches suivantes travaillent maintenant:

  • inappbrowser ouvert
  • caméra de déclenchement de inappbrowser
  • obtenir une image à inappbrowser
  • inappbrowser près

mais si je veux ouvrir la inappbrowser à nouveau (sans redémarrer l'application), la sous-vue s'ouvre mais ne montre rien, juste une page vierge. Il fonctionne à nouveau lorsque je redémarre l'application, mais chaque fois que l'inappBrowser s'ouvre après la fermeture de l'application ne montre qu'un écran vide.
Je soupçonne qu'il y a quelques résidus de l'inapprowser qui sont la cause du problème.
Je vois 2 solutions possibles ici:

  • tout supprimer la inappbrowser sur CONCERNANT LE fermeture
  • le inappbrowser REINITIALIZE tout sur tous les écraser commencent

Je ne sais pas comment implemet non plus.
Quelqu'un peut-il m'aider s'il vous plaît ou indiquer dans la direction générale d'une solution possible. Je sais que ce n'est pas le comportement attendu de l'inapp- navigateur car il veut rendre les appels à l'API native impossible, mais j'en ai besoin de cette façon. Iframes ou la fermeture de l'inappbrowser pour obtenir l'appareil photo n'est pas une option.

+0

Ne pensez pas que ce soit possible. Et comme vous l'avez dit, "pas le comportement prévu de l'InAppBrowser". Je déconseille de le faire ... Pourquoi ne pouvez-vous pas inclure la page que vous ouvrez avec InAppBrowser dans le cadre de votre application? – johnborges

+0

Bravo pour la réflexion en dehors de la boîte! Même si je n'ai pas réfléchi à votre cas d'utilisation, il est très possible d'étendre/de modifier l'IAB pour faire toutes sortes de choses sympas. J'ai trouvé que simplement ajouter d'autres plugins directement accessibles depuis la barre d'outils IAB (par exemple à côté du bouton Terminé) pour être très simple et élégant. J'ai implémenté le partage, l'impression et d'autres fonctionnalités sur iOS et Android, sans trop m'inquiéter. Le problème de hiérarchie des vues que vous avez découvert peut vous amener à "réparer" les composants mal implémentés de SplashImage, ce qui a un impact négatif sur la pile de vue ... – gro

+0

... Peut-être que découper certaines de ces choses ou les remplacer complètement dans le plugin de la caméra. Vous comprendrez, car vous êtes déjà assez loin. – gro

Répondre

2

Je l'ai compris! Vous devez modifier la méthode de démonstration de CDVInAppBrowser:

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]; 
    } 
}); 

simplement supprimer la ligne commentée et ajoutez les 2 suivant la ligne commenté.Dans la méthode close de CDVInAppBrowser vous devez ajouter:

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

juste avant [self.inAppBrowserViewController close];.
Terminé, l'appareil photo s'ouvre maintenant au-dessus de l'inapp-navigateur et lui transmet l'image.

+0

Correction pour moi! –