[Résolu] Taille d'une frame

août 2014 modifié dans API UIKit #1

Bonjour à  tous,


 


J'ai ce code dans le init d'un viewController :



NSLog(@FRAME WIDTH : %f, self.webView.frame.size.width);
NSLog(@FRAME HEIGHT : %f, self.webView.frame.size.height);

Quel que soit le device (iPad ou iPhone), j'ai toujours les mêmes valeurs.



FRAME WIDTH : 320.000000
FRAME HEIGHT : 440.000000

Je pense que j'utilise pas les bonnes propriétés mais après plusieurs essais je viens vers vous. J'ai aussi essayé :



NSLog(@FRAME WIDTH : %f, self.view.frame.size.width);
NSLog(@FRAME HEIGHT : %f, self.view.frame.size.height);

Idem.


 


Merci pour votre aide.


Réponses

  • CéroceCéroce Membre, Modérateur
    La frame n'est réellement calculée que lorsque la vue est affichée (après -viewDidAppear).
    Avant, tu auras la frame définie dans le xib ou le storyboard.
  • Rhaaa, j'y ai pas pensé, merci.

     

    Déplacé dans webViewDidStartLoad et c'est bon.


  • août 2014 modifié #4

    Je reviens ici parce que en fait, ça ne marche pas tout à  fait. En fait je suis obligé d'avoir un setFrame à  deux endroits différents pour que la UIProgressBar soit à  la bonne dimension du iPad. Sur iPhone c'est ok mais sur iPad j'ai soit rien, soit une moitié de barre.


     


    Donc j'ai ceci dans le init :



    self.progressDownload = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
    [self.progressDownload setFrame:CGRectMake(0, 0, self.view.bounds.size.width, 4)];
    [self.progressDownload setHidden:YES];
    [self.webView addSubview:self.progressDownload];

    Et ceci :



    - (void)viewDidAppear:(BOOL)animated
    {
    [self.progressDownload setFrame:CGRectMake(0, 0, self.view.bounds.size.width, 4)];
    }

    Si je supprime le setFrame dans le init, je n'ai plus de UIProgressBar qui s'affiche. Si je supprime celui du viewDidAppear, alors elle fait la moitié de l'écran.


     


    Quelqu'un aurait il une solution ? Je trouve anormal d'avoir la même ligne de code (ou en tout cas deux appels) du setFrame. Que celui du init soit éroné, a la limite (et encore que) mais l'autre seul devrait fonctionner.


     


    Merci pour vos lumières.


  • CéroceCéroce Membre, Modérateur
    Je suis d'accord avec toi, a priori, tu n'as pas besoin de donner de frame après l'init, on s'en fiche à  ce moment-là .

    À quoi correspond self.view ? C'est une UIView toute simple ?
    Vérifie ce que vaut self.view.bounds à  ce moment là .
  • août 2014 modifié #6

    Ah oui, j'ai oublié de préciser que j'ai testé self.view et self.webview. Dans les deux cas, le résultat est identique.


     


    Comme on travaille avec Cordova, je pense que la view est celle du .xib sur laquelle est positionné la UIWebView qui prends toute la taille disponible du terminal.


     


    Sinon voici le résultat que tu me demandes de vérifier :



    INIT : 320.000000
    DID : 768.000000

  • Bon sinon je déplace mon code de l'UIProgressView dans le viewDidAppear ? Au moins j'ai pas des trucs partout, voir doublé.


     


    D'ailleurs le init de mes autres composants comme le UIAlertView au même endroit non ?


  • Personnellement je construis tous les composants graphique dans les xibs, je ne set presque jamais les frame par code. Dans ton cas tu peux créer la progresse bar dans ton xib et appliquer soit les masques autoresize ou bien les autolayout pour un bon affichage iPhone && iPad.


    Pour les alert view, je la créer quand j'en ai besoin c'est à  dire au moment de l'affichage du message à  l'utilisateur.
  • août 2014 modifié #9

    Le xib est vide et comme on passe par Cordova je ne sais pas qu'elle incidence il peut y avoir (si tant est qu'il y en ai une).


     


    Sinon, je viens de tester à  l'instant et c'est bon. Tout mon code du init est passé dans le viewDidAppear. Je pense que le init est à  réserver pour autre chose.


     


    Dans tous les cas, merci.


     


    EDIT : a ma grande surprise, le setFrame n'est même pas utile... :)


Connectez-vous ou Inscrivez-vous pour répondre.