[Résolu] Image de démarrage d'une application iPhone

Am_MeAm_Me Membre
juin 2013 modifié dans Apple Developer Programs #1

Bonjour a tous 


 


Actuellement j'ai mon image de démarrage de l'application mais j'ai un problème


 


Au niveau du projet > target > launch image j'ai mis mon image de démarrage mais le problème c'est que cette image s'affiche tres rapidement


 


Alors bien entendu j'ai lu la doc d'Apple http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/IconsImages/IconsImages.html#//apple_ref/doc/uid/TP40006556-CH14-SW5


 


A ce que j'ai compris le launch image c'est pour initialiser l'image de fond de l'application


 


Mais ce n'est pas ce qui m'interesse moi je souhaiterai voir mon logo par exemple durant 2 secondes et si possible avec un connection activity ( pas obligatoire)


 


Que dois-je faire ? 


 


Creer une vue ? timer ??


 


Merci d'avance  o:)


Réponses

  • SmySmy Membre
    juin 2013 modifié #2

    Tu parles du Default.png ?


     


    Si oui, c'est une image qui est affichée par iOS juste après le clic de l'utilisateur pour lancer ton appli, et qui reste visible jusqu'à  la fin du lancement complet.


     


    Si tu veux afficher cette image plus longtemps, je te conseille un UIViewController "Splash Screen", ou une view par dessus ton premier controller.


  • Am_MeAm_Me Membre

    Donc premiere solution c'est de creer un UIviewController de nom Splash Screen ou UIview


    Alors ok bon je vais me renseigner de comment afficher un UIViewController durant un certain temps


     


    Mais le default.png ne s'affiche qu'un millieme de seconde et moi je voudrai vraiment afficher mon logo durant 2 secondes (je me repete) par exemple




  • Bonjour a tous 


     


    Actuellement j'ai mon image de démarrage de l'application mais j'ai un problème


     


    Au niveau du projet > target > launch image j'ai mis mon image de démarrage mais le problème c'est que cette image s'affiche tres rapidement


     


    Alors bien entendu j'ai lu la doc d'Apple http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/IconsImages/IconsImages.html#//apple_ref/doc/uid/TP40006556-CH14-SW5


     


    A ce que j'ai compris le launch image c'est pour initialiser l'image de fond de l'application


     




     


    Non, la launch image est utilisée pour réaliser la transition graphique entre le moment où l'utilisateur démarre l'application et lorsque celle-ci devient active. Ce n'est donc pas à  proprement parler une image de fond.


     


     


     




     


    Mais ce n'est pas ce qui m'interesse moi je souhaiterai voir mon logo par exemple durant 2 secondes et si possible avec un connection activity ( pas obligatoire)


     


    Que dois-je faire ? 


     


    Creer une vue ? timer ??


     


    Merci d'avance  o:)




     


    Petite digression par rapport à  ton besoin : est-ce qu'il répond à  une contrainte technique ou est-ce juste pour faire joli ? 2 secondes c'est long et court à  la fois. Qu'est-ce que cela apportera à  l'utilisateur sachant que celui-ci attend à  ce que l'application soit immédiatement disponible.


     


    Bien que je n'ai jamais tenté ce genre de chose, j'imagines que tu peux créer une UIImageView avec une animation de sorte que lorsque l'animation se termine tu supprimes cette image view.

  • Am_MeAm_Me Membre
    juin 2013 modifié #5
    Non, la launch image est utilisée pour réaliser la transition graphique entre le moment où l'utilisateur démarre l'application et lorsque celle-ci devient active. Ce n'est donc pas à  proprement parler une image de fond.

     



     


    Je me suis mal exprimé mais ce ce que je voulais dire au fond


     


    est-ce qu'il répond à  une contrainte technique ou est-ce juste pour faire joli ? 2 secondes c'est long et court à  la fois.

     



     


    Je suis en stage on m'a dit tout simplement faut que les logos soit visible (pas de temps impose etc ... je suis libre )


    Moi c'était pour faire jolie entre guillemet que je voulais le connectionActivity


     


    Ok l'imageView a afficher durant un certain temps


     


    Merci a vous deux et aux futurs solution je marque le post comme Résolu mais n'hésitez pas a balancer vos idées :P


  • HorusHorus Membre
    juin 2013 modifié #6

    Salut, 


     


    si j'ai bien compris tu peux utiliser ce code : 


     


    (à  placer dans ton AppDelegate et dans la fonction: didFinishLaunchingWithOptions sauf pour le #define IS_IPHONE5 [.....] bien sur ^^ ) :



    #define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) // savoir si c'est un iPhone 5


    [self.window makeKeyAndVisible];


    if(IS_IPHONE5){
    splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 320, 580)];
    splashView.image = [UIImage imageNamed:@Default-568h@2x.png];
    }
    else{
    splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 320, 480)];
    splashView.image = [UIImage imageNamed:@Default.png];
    }
    [window addSubview:splashView];
    [window bringSubviewToFront:splashView];
    [UIView beginAnimations:nil context:nil];
    if(IS_IPHONE5){
    [UIView setAnimationDuration:4];

    }
    else{
    [UIView setAnimationDuration:1];

    }

    [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:window cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector (startupAnimationDone:finished:context:)];



    splashView.frame = CGRectMake(-60, -60, 440, 600); splashView.alpha = 0.0; [UIView commitAnimations];


    Pour voir le résultat tu peux télécharger "  Part of Fun " j'utilise cette méthode dans mon application. 


  • Am_MeAm_Me Membre
    juin 2013 modifié #7

    Merci je testerai ton application tout a l'heure :D


     


    Mais j'ai une question qui me tarode 


     


    moi actuellement dans mon didFinishLaunchingWithOptions je n'ai que ca


     


     


    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


    {    


        return YES;


    }


     


    Ton code ne va pas me mettre un maudit ecran noire ?


     


    Bon je testerai ca tout a l'heure


     


    J'ai teste ca MARCHE super


  • Am_MeAm_Me Membre
    juin 2013 modifié #8


    Salut, 


     


    si j'ai bien compris tu peux utiliser ce code : 


     


    (à  placer dans ton AppDelegate et dans la fonction: didFinishLaunchingWithOptions sauf pour le #define IS_IPHONE5 [.....] bien sur ^^ ) :





    Pour voir le résultat tu peux télécharger "  Part of Fun " j'utilise cette méthode dans mon application. 




     


    Mais comment tu fais pour lui dire de faire cette animation ? je suis super nul niveau animation je galere toujours 


     


    Moi je vois que ca 


    [UIView beginAnimations:nil context:nil];


  • AliGatorAliGator Membre, Modérateur

    Quelle horreur ce IS_IPHONE5 !!! A banir !


    Utiliser plutôt la propriété applicationFrame de [UIScreen mainScreen]


     


    Et pour l'animation, ne plus utiliser les méthodes de [UIView setAnimationDelegate:], [UIView setAnimationDidStopSelector:], [UIView beginAnimations:context:] & co !! Ces méthodes sont dépréciées depuis un petit bout de temps maintenant. Utiliser leurs variantes utilisant les blocks plutôt, qui sont celles à  utiliser officiellement maintenant.


     


    Autre solution alternative, créer un UIViewController pour l'occasion, avec la UIImageView qui prend tout l'écran, le présenter avec [self presentModalViewController:animated:NO] pour ne pas avoir d'animation de présentation, et mettre un timer dans le viewDidAppear pour dismisser le VC au bout de 2s.


  • Am_MeAm_Me Membre
    juin 2013 modifié #10

    Je tiens a ajouter pour le 


    Quelle horreur ce IS_IPHONE5 !!! A banir !

     




    NSLog(@TAILLE DE MON ECRAN : %f x %f,[UIScreen mainScreen].bounds.size.height,[UIScreen mainScreen].bounds.size.width);
        if ([UIScreen mainScreen].bounds.size.height==568) {
            NSLog(@C'est un iPhone 5);
            
            
        } else {
            NSLog(@C'est un iphone 3gs/4/4s);
        }

    C'est de ca que veut parler je crois le Crocodile (AliGator pour ne pas ecorcher son pseudo :D)


     


     


    Et le navigationController doit pointer vers ma vue de l'application ou vers la vue AVEC l'image ?


  • SmySmy Membre
    juin 2013 modifié #11


    Quelle horreur ce IS_IPHONE5 !!! A banir !


    Utiliser plutôt la propriété applicationFrame de [UIScreen mainScreen]




     


    Et pourquoi pas le bounds, plus logique car il n'y a pas le retrait de la title bar ?

  • Am_MeAm_Me Membre
    juin 2013 modifié #12

    HomeViewController *home = [HomeViewController alloc];


        [self presentModalViewController:home animated:NO];


     


    ne me fais rien enfin j'ai un probleme c'est que ma classe HomeViewController n'a pas de fonction initWithNbnam et mais un inithWithCoder et je sais pas comment lui dire tout simplement affiche moi cette vuecontroller


     


    Au bout des 2 secondes il me cache bien le logo mais écran NOIR  B)


  • Toujours bloqué  :o


    Tout essaye meme [HomeViewController new];


  • AliGatorAliGator Membre, Modérateur


    Et pourquoi pas le bounds, plus logique car il n'y a pas le retrait de la title bar ?




    Parce que justement c'est plus logique de prendre la zone dans laquelle tu peux afficher l'image, plutôt que d'utiliser tout l'écran au risque qu'une partie soit masquée par la statusBar.


     


    Le applicationFrame aura la taille de la zone dans laquelle tu peux afficher du contenu. Donc la taille de la zone dans laquelle tu vas mettre ton UIImageView affichant l'image de démarrage (splashscreen).


     


     - Si tu as configuré ton SplashScreenViewController pour qu'il masque la statusBar quand il s'affiche, alors l'applicationFrame va bien avoir la taille de tout l'écran.


     - Si tu as configuré ton SplashScreenViewController pour avoir la statusBar (en tout cas ne pas la masquer), alors applicationFrame va avoir la taille de la zone où tu peux mettre du contenu, c'est à  dire la zone sous la statusBar. Et c'est ce qu'il faut, car si tu mettais ton UIImageView pour prendre tout l'écran ([UIScreen mainScreen].bounds.size), alors que la statusBar est affichée, cette statusBar masquerait le haut de ton UIImageView (qui, elle, passerait sous la statusBar et serait masqué par elle) donc ton image serait coupée par la barre de statut...

  • Am_MeAm_Me Membre
    juin 2013 modifié #15

    Merci pour ses infos Aligator 


    j'ai fais ce que tu m'a demande mais 


     


    je me recite 


     



    HomeViewController *home = [HomeViewController alloc];


        [self presentModalViewController:home animated:NO];


     


    ne me fais rien enfin j'ai un probleme c'est que ma classe HomeViewController n'a pas de fonction initWithNbnam et mais un inithWithCoder et je sais pas comment lui dire tout simplement affiche moi cette vuecontroller


     


    Au bout des 2 secondes il me cache bien le logo mais écran NOIR   B)


     


    J'alloc rien en fait enfin je sais pas comment lui dire demarre l'appli normalement quoi



  • CéroceCéroce Membre, Modérateur

    HomeViewController hérite-t-il bien de UIViewController ?


  • Am_MeAm_Me Membre
    juin 2013 modifié #17

    Oui effectivement il herite bien disons :


     


     


    @interface HomeViewController : UIViewController


     


    que c'est un UIviewController


  • SmySmy Membre


    Parce que justement c'est plus logique de prendre la zone dans laquelle tu peux afficher l'image, plutôt que d'utiliser tout l'écran au risque qu'une partie soit masquée par la statusBar.




     


    Ok, c'est logique quand tu as besoin de définir les dimensions de ta view. Quand tu es en auto resize et que tu ne veux que changer l'image pour passer sur une -568h, le bounds est équivalent.

  • AliGatorAliGator Membre, Modérateur


    HomeViewController *home = [HomeViewController alloc];


        [self presentModalViewController:home animated:NO];


     


    ne me fais rien enfin j'ai un probleme c'est que ma classe HomeViewController n'a pas de fonction initWithNbnam et mais un inithWithCoder et je sais pas comment lui dire tout simplement affiche moi cette vuecontroller


     


    Au bout des 2 secondes il me cache bien le logo mais écran NOIR  B)




    Normal l'écran noir si tu ne lui dis pas sur quel XIB se baser (en supposant que tu aies fait l'interface de ce VC via un XIB) ou si tu n'as pas implémenté loadView ou viewDidLoad (pour créer la hiérarchie de vue par code plutôt que pas XIB).


     


    Pas normal que tu n'aies pas un initWithNibName si tu as bien hérité de UIViewController.

  • Am_MeAm_Me Membre
    juin 2013 modifié #20

    J'utilise le StoryBoard donc le initWithCoder est la fonction que j'utilise car initWithNbname n'est jamais appelé


    Et si mon programme marche tres bien mais pas en ajoutant le nouveau controller qui contien l'UIimageview


    J'ai creer une classe comme tu me l'a demander


  • J'ai trouvé 


     


    http://jonathanwidlund.com/initwithnibname-using-storyboard/


     


     


    To initialize a view controller with a nib file you use initWithNibName.


    UIViewController *viewController = [[ViewController alloc] initWithNibName:@ViewController bundle:nil];


    But I use Storyboard instead of nib files? Then the UIStoryboard class is your friend.


    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@MyStoryboard bundle:nil];

    UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@ViewController];


     


    MAIS j'ai un probleme ma navigation barre ou item bref elle ne s'affiche pas



  • Quelle horreur ce IS_IPHONE5 !!! A banir !


    Utiliser plutôt la propriété applicationFrame de [UIScreen mainScreen]




     


    D'accord je change ça dans mon code oupss ... ^^

  • AliGatorAliGator Membre, Modérateur
    En pratique, et ça c'est vrai pour tous les développements (y compris pour le développement Web par exemple), il ne faut jamais tester si tu es sur telle ou telle machine/navigateur ou sur telle ou telle version du système ou du navigateur ou autre. Il faut tester si une fonctionnalité est disponible.

    Si tu veux appeler une méthode qui n'est apparue qu'en iOS6 par exemple, il ne faut pas tester si la version d'iOS est en 6 ou supérieur. Il faut tester si la méthode existe. Non seulement c'est plus logique, mais en plus si la méthode disparait le test continuera de fonctionner et d'avoir du sens (donc de ne plus appeler la méthode si elle n'existe plus en iOS7 ou 8)

    Pareil pour les tailles d'écran. Il ne faut pas utiliser de Magic Number (genre le 568 ou 580 ou 480) qui sort d'on ne sait-où, d'autant que ça reste des valeurs en dur pas assez génériques, et en plus c'est sujet à  erreur (la preuve, dans le cas où ton écran a une taille de 568, tu as utilisé la valeur 580 pour la hauteur de ton UIImageView, je sais pas d'où ça sort ce 580 mais ça sent l'erreur...)
    Dans tous les cas de toute façon, il ne faut pas tester le modèle du téléphone, savoir si tu es en iPhone5 ou iPhone 4/4S, d'autant que si un iPhone6 sort avec une résolution encore différente, ou si un jour tu reprends ton code et tes classes pour les réutiliser dans une appli iPad, ça ne sera pas assez générique. Non, il faut directement utiliser les valeurs retournées par les méthodes comme celles de UIScreen, pour obtenir la taille de l'écran et placer la frame de notre UIImageView en conséquence.

    Comme ça si un jour on a une autre résolution, ça marchera encore. Si tu portes sur iPad, ça s'adaptera également. Et plus fort encore, cas auquel je suis sûr que tu n'as pas pensé et qui n'est pas traité par ton code alors qu'il faut pourtant l'adresser, si ta statusBar ne fait pas 20px mais 40px (par exemple, tu as une navigation GPS en cours, ou tu as activé le partage de connexion (barre bleutée), ou un appel téléphonique en cours (barre teintée de vert...) où dans tous ces cas-là  la statusBar est 2x plus haute). Dans ce cas ton code positionne mal l'imageView, alors qu'utiliser applicationFrame prend bien en compte l'espace disponible pour placer tes éléments d'UI, dans tous les cas de figure de statusBar masquée, de 20px ou de 40px.
  • Am_MeAm_Me Membre
    juillet 2013 modifié #24

    Je remonte ce post car en fait jusque la ce que tu m'avais conseillé Ali marchait tres bien


     


    Mais aujourd'hui je viens d'effecture un changement majeur en ajoutant le slide panel comme sur l'application facebook or l'implémentation m'oblige à  mettre ma vue principal comme self.rootViewController


     


    Ce qui fait  que mon écran de démarrage ne s'affiche plus.


     


    J'ai une question peut on changer le rootViewController dans une autre class que AppdDelegate ?


  • CéroceCéroce Membre, Modérateur
    juillet 2013 modifié #25


    J'ai une question peut on changer le rootViewController dans une autre class que AppdDelegate ?




     


    Je ne crois pas... Si on ne définit pas le rootViewController de la UIWindow, on obtient un message comme quoi le rootViewController doit être défini à  la fin de l'init de l'appli. Ce qui pour moi signifie qu'il faut sans doute le faire dans la méthode -[UIApplicationDelegate applicationDidFinishLaunchingWithOptions:]. Cela dit, je n'en suis pas sûr.


     


    Mais je ne crois pas que là  soit la question. En gros, ton problème est que ton rootViewController n'est pas celui que que tu veux voir s'afficher en premier. C'est un cas classique quand il y a un VC de Login.


     


    Il y a deux solutions:


    1) Immédiatement après l'affichage du rootViewController, afficher le VC voulu.


    2) Faire en sorte que le rootViewController soit un troisième VC, qui aura toute latitude pour prendre le contenu d'un VC "enfant".


  • J'ai choisi la 1 merci :D

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