91 votes

Barre d'état iOS 7 avec Phonegap

Dans iOS 7, les applications Phonegap apparaîtront sous la barre d'état. Cela peut rendre difficile le fait de cliquer sur des boutons/menus qui ont été placés en haut de l'écran.

Quelqu'un connaît-il un moyen de résoudre ce problème de barre d'état sur iOS 7 dans une application Phonegap ?

J'ai essayé de décaler l'ensemble de la page web à l'aide de CSS, mais cela ne semble pas fonctionner. Existe-t-il un moyen de décaler l'ensemble de l'UIWebView ou de faire en sorte que la barre d'état se comporte comme elle le faisait dans iOS6 ?

Remerciements

0 votes

Quel est exactement le "problème de la barre d'état" ? Y a-t-il un exemple de code à reproduire ?

1 votes

@ShivanRaptor Avec iOS 7, la barre d'état fait désormais partie de l'affichage, donc si vous avez des éléments qui se trouvaient en haut de l'écran avec les versions précédentes d'iOS, ils se trouvent maintenant sous la barre d'état, et non pas automatiquement poussés juste en dessous, ce qui peut causer quelques problèmes. Ma suggestion serait de créer une enveloppe pour votre contenu, et de définir une marge supérieure de 20px.

0 votes

@AndrewLively - Cela ne fonctionne pas vraiment lorsque la page défile, y a-t-il un moyen de déplacer l'UIWebView ?

142voto

Ludwig Kristoffersson Points 1570

J'ai trouvé une réponse dans un autre fil, mais je vais répondre à la question au cas où quelqu'un d'autre se la poserait.

Il suffit de remplacer le viewWillAppear en MainViewController.m avec ceci :

- (void)viewWillAppear:(BOOL)animated {
    // View defaults to full size.  If you want to customize the view's size, or its subviews (e.g. webView),
    // you can do so here.
    // Lower screen 20px on ios 7
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 20;
        viewBounds.size.height = viewBounds.size.height - 20;
        self.webView.frame = viewBounds;
    }
    [super viewWillAppear:animated];
}

9 votes

Quelqu'un d'autre l'utilise-t-il avec le plugin In App Browser ? Si je configure le In App Browser en "presentationstyle=fullscreen", une marge inférieure vide apparaît après la fermeture du navigateur. Il semble que la marge soit de la même hauteur que la barre d'outils InAppBrowser. Le fait de régler le type de présentation sur "pagesheet" corrige le problème sur l'iPad, mais l'iPhone semble toujours utiliser "fullscreen". Y a-t-il des solutions ?

1 votes

Très reconnaissant pour la réponse - cependant le même problème s'applique au navigateur inApp de PhoneGap - il recouvre également la barre d'état. Des idées pour cela ?

2 votes

Oui, nous utilisons une ancienne version de Cordova (2.3.0), et pour résoudre ce problème, vous devez définir webViewBounds.origin.y = 20 ; dans createViewsWithOptions. Vérifiez également si la couleur d'arrière-plan est définie et jouez avec cela. Faites une vérification de version pour iOS7 et plus, comme dans cette excellente réponse de LudWig Kristoffersson.

37voto

Alex L Points 3954

En plus de la solution de redimensionnement proposée par Ludwig Kristoffersson, je recommande de modifier la couleur de la barre d'état :

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 20;
        viewBounds.size.height = viewBounds.size.height - 20;
        self.webView.frame = viewBounds;
    }
    self.view.backgroundColor = [UIColor blackColor];
}
-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}

1 votes

Fonctionne très bien :) Merci beaucoup :)

0 votes

Parfait - c'était la meilleure solution pour moi.

0 votes

Cette correction fonctionne localement après une compilation de Xcode, mais pas après une compilation de Phonegap. Des idées ? J'ai une application ios construite avec phonegap 2.9

22voto

xdemocle Points 336

Installez ce plugin pour Phonegap : https://build.phonegap.com/plugins/505

Et utilisez les paramètres corrects comme ci-dessous, pour contrôler la superposition de la vue web :

<preference name="StatusBarOverlaysWebView" value="false" />

Pour moi, avec Phonegap 3.3.0, cela fonctionne.

Plus d'informations sur la page du projet Github : https://github.com/phonegap-build/StatusBarPlugin

0 votes

Merci beaucoup pour cette réponse ! J'ai essayé ce plugin : build.phonegap.com/plugins/715 Le problème, c'est que les noms sont les mêmes. Mais cela ne fonctionne jamais pour moi. Merci beaucoup !

0 votes

Pour être honnête, je ne me souviens pas si j'ai essayé avant celui que vous avez mentionné.

20voto

markmarijnissen Points 1302

Pour masquer la barre d'état, ajoutez le code suivant dans le fichier MainViewController.m sous la fonction -(void)viewDidUnload

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

0 votes

Ceci fait l'affaire. Il cache la barre d'état et rend votre application plein écran. Je n'ai testé que sur le simulateur, mais je ferai un rapport plus tard lorsque j'aurai lancé une version sur mes iPhones et iPads.

0 votes

Fonctionne pour moi sur iOS sur un iPad 2

0 votes

Cela fonctionne très bien sur l'iPad Air iOS 7.1.2 et il n'y a pas besoin de modifications ou de plugins. Excellente réponse, merci !

15voto

dieppe Points 131

Réponse https://stackoverflow.com/a/19249775/1502287 a fonctionné pour moi, mais j'ai dû le modifier un peu pour qu'il fonctionne avec le plugin caméra (et potentiellement d'autres) et une balise méta viewport avec "height=device-height" (ne pas définir la partie hauteur aurait fait apparaître le clavier au-dessus de la vue dans mon cas, cachant certaines entrées en cours de route).

Chaque fois que vous ouvrirez la vue de la caméra et que vous retournerez dans votre application, la méthode viewWillAppear sera appelée et votre vue sera réduite de 20px.

De plus, la hauteur de l'appareil pour la fenêtre d'affichage inclurait les 20 px supplémentaires, ce qui rendrait le contenu défilable et 20 px plus haut que la fenêtre d'affichage.

Voici la solution complète au problème de l'appareil photo :

Dans MainViewController.h :

@interface MainViewController : CDVViewController
@property (atomic) BOOL viewSizeChanged;
@end

Dans MainViewController.m :

@implementation MainViewController

@synthesize viewSizeChanged;

[...]

- (id)init
{
    self = [super init];
    if (self) {
        // On init, size has not yet been changed
        self.viewSizeChanged = NO;
        // Uncomment to override the CDVCommandDelegateImpl used
        // _commandDelegate = [[MainCommandDelegate alloc] initWithViewController:self];
        // Uncomment to override the CDVCommandQueue used
        // _commandQueue = [[MainCommandQueue alloc] initWithViewController:self];
    }
    return self;
}

[...]

- (void)viewWillAppear:(BOOL)animated
{
    // View defaults to full size.  If you want to customize the view's size, or its subviews (e.g. webView),
    // you can do so here.
    // Lower screen 20px on ios 7 if not already done
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7 && !self.viewSizeChanged) {
        CGRect viewBounds = [self.webView bounds];
        viewBounds.origin.y = 20;
        viewBounds.size.height = viewBounds.size.height - 20;
        self.webView.frame = viewBounds;
        self.viewSizeChanged = YES;
    }
    [super viewWillAppear:animated];
}

Pour ce qui est du problème de l'affichage, ajoutez ceci (en utilisant jQuery) dans l'écouteur de l'événement "deviceready" (prêt à l'emploi) :

if (window.device && parseFloat(window.device.version) >= 7) {
  $(window).on('orientationchange', function () {
      var orientation = parseInt(window.orientation, 10);
      // We now the width of the device is 320px for all iphones
      // Default height for landscape (remove the 20px statusbar)
      var height = 300;
      // Default width for portrait
      var width = 320;
      if (orientation !== -90 && orientation !== 90 ) {
        // Portrait height is that of the document minus the 20px of
        // the statusbar
        height = document.documentElement.clientHeight - 20;
      } else {
        // This one I found experimenting. It seems the clientHeight
        // property is wrongly set (or I misunderstood how it was
        // supposed to work).
        // I don't know if it is specific to my setup.
        width = document.documentElement.clientHeight + 20;
      }
      document.querySelector('meta[name=viewport]')
        .setAttribute('content',
          'width=' + width + ',' +
          'height=' + height + ',' +
          'initial-scale=1.0,maximum-scale=1.0,user-scalable=no');
    })
    .trigger('orientationchange');
}

Voici la fenêtre de visualisation que j'utilise pour les autres versions :

<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0" />

Et tout fonctionne bien maintenant.

0 votes

Toute méthode sans Jquery @dieppe

0 votes

Il suffit d'ajouter ce code à - (void)imagePickerController :(UIImagePickerController*)picker didFinishPickingMediaWithInfo :(NSDictionary*)info {} la méthode à l'intérieur de CDVCamera.m qui résout également le problème de la caméra. NSLog(@"CLOSED CAMERA") ; [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone] ;

0 votes

Je n'ai pas les mots pour vous remercier ! Je me suis battu avec le problème du rétrécissement de 20px avec l'appareil photo, et je n'ai pas pu trouver la solution jusqu'à maintenant...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X