Charger les éléments de la prochaine vue avant animation

cyril94440cyril94440 Membre
décembre 2012 modifié dans Apple Developer Programs #1
Bonjour ,

je vous explique rapidement le problème.



Je change de vue en utilisant une animation de page, seulement le texte (la webView) ne s'affiche qu'une fois l'animation terminée alors que d'après le NSLog, la webview a déja fini de charger. Comment remédier à  cela ?



Voici le code :
<br />
UIViewAnimationTransition trans = UIViewAnimationTransitionCurlUp;<br />
[UIView beginAnimations: nil context: nil];<br />
[UIView setAnimationDuration: 0.3f];<br />
[UIView setAnimationTransition: trans forView: [(AppDelegate *)[[UIApplication sharedApplication] delegate] window] cache: YES];<br />
[self presentViewController:newPageController animated:NO completion:nil];<br />
[UIView commitAnimations];<br />




Merci d'avance

Réponses

  • CéroceCéroce Membre, Modérateur
    Si tu mets ton NSLog() dans -viewDidLoad, alors c'est normal. Comment fais-tu pour détecter la fin du chargement de la Webview?
  • C'est pas en nous filant le code de ton animation (outre le fait qu'il soit totalement dépassé d'ailleurs.. on utilise +animateWithDuration:......... maintenant ou +transitionWith...) qu'on va pouvoir t'aider.

    Ce qui serait intéressant c'est de savoir QUAND tu appelles ce code.



    Et utiliser le delegate de UIApplication pour récupérer la fenêtre n'est pas forcément une bonne idée (c'est assez sale en fait). Je te conseille d'utiliser -windows de UIApplication ou de récupérer sa -keyWindow.
  • cyril94440cyril94440 Membre
    décembre 2012 modifié #4
    Merci de votre réponse, je vais me renseigner du coté du +animateWithDuration et de la window, merci pour les remarques.



    Concernant le problème de sujet voici les détails :



    Sur la première page, j'appelle la deuxième grâce à  la méthode délégué de la UIWebView :


    <br />
    - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{<br />
    




    Et donc dedans, j'appelle la suivante grâce au code de mon premier post.



    Ensuite, sur le contrôleur appelé , je charge ma nouvelle UIWebView dans le viewDidLoad.



    Puis dans le :


    <br />
    - (void)webViewDidFinishLoad:(UIWebView *)webView{<br />
    




    Je met un NSLog.



    Et ce NSLog s'affiche avant que la transition soit fini, pourtant derrière l'animation PageCurl on ne visualise pas déjà  le contenu de la UIWebView, et du coup ca fait une espèce de saccade pas super.
  • UP image/smile.png' class='bbc_emoticon' alt=':)' /> ?
  • CéroceCéroce Membre, Modérateur
    Pourquoi ne lances-tu pas l'animation dans webViewDidFinishLoading ?
  • Parce que je m'étais dit que de lancer l'anim le plus vite possible , ça améliorerait la réactivité parce que le but c'est que l'utilisateur ne se rende pas compte que c'est une web view , mais je vais tester ça !
  • CéroceCéroce Membre, Modérateur
    Il faut être cohérent aussi...

    Ton problème est que la webview s'affiche vide. Si tu veux qu'elle s'affiche pleine, il faut bien qu'elle ait chargé les données, non ?
  • Je vois !

    L'animation se met pas a jour avant qu'elle soit fini c'est pour ça ?



    Du coup je lance l'animation directement de la seconde vue , donc celle qui va s'afficher , une fois la webview chargée .

    Comment faire ça proprement ?
  • CéroceCéroce Membre, Modérateur
    'cyril94440' a écrit:


    Je vois !

    L'animation se met pas a jour avant qu'elle soit fini c'est pour ça ?


    Les animations se font sur des CALayers, qu'on peut voir comme des caches des images rendues. De fait, on dirait que l'animation est faite avec le contenu de la CALayer avant le lancement de l'animation. N'ayant jamais tenté de mettre à  jour le contenu d'une CALayer pendant une animation, je n'en sais pas plus.

    De toute façon, même si ça fonctionnait, ce n'est pas ce que tu veux, parce qu'on verrait la webview vide se remplir pendant l'animation. Il faut dans tous les cas qu'elle soit chargée avant.


    'cyril94440' a écrit:


    Du coup je lance l'animation directement de la seconde vue , donc celle qui va s'afficher , une fois la webview chargée .

    Comment faire ça proprement ?


    Là , je ne comprends pas bien.
  • Ok, merci beaucoup pour l'explication image/smile.png' class='bbc_emoticon' alt=':)' /> c'est donc pour ça !



    Actuellement , j'appelle mon view controller(VC) numéro 2 (celui qui contient la web view) depuis le numéro 1 (celui qui est affiché avant l'animation).

    Or le délégate de la webview du VC2 est le VC2, donc comment depuis le VC1 , charger le VC2 attendre qu'il soit chargé puis lancer l'animation.

    J'ai d'abord pensé a déclarer le VC1 en tant que délégué de la webview du VC2, sauf que les 2 sont de la même classe , de plus le didfinishload ne semble pas s'appeler.

    Enfin bref je sais pas comment m'y prendre, quelles méthodes utiliser (addSubview, presentVC, ou autre)
  • CéroceCéroce Membre, Modérateur
    décembre 2012 modifié #12
    Il y a plusieurs solutions possibles.



    1) Mettre VC1 en délégué de la webview temporairement

    Je ne vais pas aller dans les détails; l'implémentation est simple, mais l'archi n'est pas très claire.

    Le fait que les deux VC soient de la même classe (...étrange) n'a pas d'importance, puisque la webview n'a qu'un délégué.



    2) Implémenter un système de délégation.

    VC2 prévient VC1(son délégué) quand la webview aura été chargée. Exemple:



    ViewController2.h
    @class ViewController2;<br />
    <br />
    @protocol ViewController2Delegate<br />
    - (void) viewController2WebViewDidLoad:(ViewController2 *)controller;<br />
    @end<br />
    <br />
    @interface ViewController2:UIViewController<br />
    @property (nonatomic, weak) id &lt;ViewController2Delegate&gt; delegate;<br />
    @end<br />
    




    Il faut mettre VC1 en délégué.

    Ensuite, il suffira d'appeler:
    [self.delegate viewController2WebViewDidLoad:self];
    


    dans l'implémentation de [font=helvetica, arial, sans-serif]webViewDidFinishLoading dans VC2.[/font]
  • D'accord , je comprends bien le principe.

    (Les 2 VC sont de la même classe car il s'agit de UIWebView différentes, et dont les transitions doivent être gérées en iOS, pas en web).



    Dernier petit point et après je pense que ca fonctionnera :

    Je n'arrive pas à  charger mon VC2.

    Lorsque je fais :
    <br />
    ViewController *newPageController = [[UIStoryboard storyboardWithName:@&quot;MainStoryboard&quot; bundle:nil] instantiateViewControllerWithIdentifier:@&quot;root&quot;];<br />
    




    Le viewDidLoad n'est pas appelé , donc encore moins le webViewDidFinishLoading.

    j'ai essayé la méthode loadView mais sans succès.
  • CéroceCéroce Membre, Modérateur
    On vient d'en parler. Ce n'est pas la bonne manière d'instancier un view controller avec Storyboard.
  • On vient d'en parler ??

    Je n'ai pas compris désolé ...
  • Ce que je ne comprends pas , c'est que dans mon VC2 , je fais mon loadRequest (de la webView) dans le viewDidLoad , or ce n'est appelé que lorsque je fais presentViewController , et je ne vois pas comment faire pour lancer le chargement avant.
  • CéroceCéroce Membre, Modérateur
    Un View Controller ne charge le nib que lorsque c'est nécessaire. En appelant sa méthode view, la vue sera chargée.
  • En appelant la méthode view , le viewDidLoad est bien chargé, mais le delegate didFinishLaunching , jamais, même si je ne touche à  rien, c'est à  dire que je laisse le delegate sur self (dans le viewDidLoad , ou même directement dans IB).



    Du coup je ne vois toujours pas comment faire
  • Une petite aide :/ ?
Connectez-vous ou Inscrivez-vous pour répondre.