web-dev-qa-db-fra.com

Comment puis-je afficher un écran de démarrage plus longtemps sur un iPhone?

Comment puis-je afficher un écran de démarrage pendant une période plus longue que celle par défaut sur un iPhone?

49
Shofiur

Lisez les directives pour l’interface humaine (HIG) Apple iPhone. L'écran de démarrage n'est pas censé être destiné à la marque ou à l'affichage d'un logo, il est supposé ressembler à la condition par défaut de l'application, de sorte qu'elle semble démarrer rapidement.

Le faire rester plus longtemps serait une violation du HIG.

39
Paul Tomblin

Le moyen le plus simple consiste à créer un UIImageView dont l’image est votre Default.png. Dans votre méthode applicationDidFinishLaunching:, ajoutez cette vue à la fenêtre et masquez-la lorsque vous souhaitez que votre écran de démarrage disparaisse.

26
Ben Gottlieb

J'avais besoin de faire cela pour bloquer l'affichage d'une vue de table jusqu'à ce que les données soient chargées sur le réseau. J'ai utilisé une variante de celle que j'ai trouvée ici:

http://michael.burford.net/2008/11/fading-defaultpng-when-iphone-app.html

Dans l'interface de votre délégué d'application:


@interface AppDelegate : NSObject 
{
  UIImageView *splashView;
}

Dans la mise en œuvre:


@implementation AppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application {


  // After this line: [window addSubview:tabBarController.view];

  splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
  splashView.image = [UIImage imageNamed:@"Default.png"];
  [window addSubview:splashView];
  [window bringSubviewToFront:splashView];

  // Do your time consuming setup

  [splashView removeFromSuperview];
  [splashView release];
}

Assurez-vous que vous avez un fichier Default.png dans les ressources

21
nevan king

dans votre appDelegate, une méthode appelée applicationDidFinishedLaunching utilise une fonction de veille. Passez un chiffre dans la fonction de veille pour le non. de secondes que vous souhaitez conserver à l'écran.


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    
    [window makeKeyAndVisible];
    [window addSubview:viewController.view];
    sleep(5);
    return YES;
}

J'ai tellement cherché cette chose et tout le monde a donné son propre point de vue complexe. Je ne pouvais pas trouver un moyen simple de me laisser faire.

KISS (Keep it simple and Smart :) J'ai évité le réel car il offensant.

18
Taimur Ajmal

Je l'ai fait assez simplement, en ayant mon rootViewController Poussez un modalViewController, en le chargeant depuis "Splash.nib" dans une sous-classe d'UIViewController que j'ai appelée "SplashViewController". L'appel exact était:

- (void) viewDidLoad {
SplashViewController *splashScreen = [[[SplashViewController alloc]    
        initWithNibName:@"SplashViewController" bundle:nil] autorelease];
[self presentModalViewController:splashScreen animated:NO];
//continue loading while MVC is over top...

Lorsque vous lancez l'application, elle apparaît immédiatement, à la manière d'un écran de démarrage. Ensuite, le nib SplashViewController est juste un UIImageView en plein écran avec un png splash, 320x480. Après une seconde NSTimer (quelque chose de plus semble gêner), il déclenche timerFireMethod, une méthode personnalisée qui appelle simplement

[self dismissModalViewControllerAnimated:YES];

Ensuite, le modal VC glisse vers le bas et s’éloigne, laissant mon haut de page tableView. La bonne chose est, tandis que le MVC est en place, la table sous-jacente peut continuer à charger en raison de la nature indépendante des contrôleurs de vue modale. Donc, je ne pense pas que cela viole les HIG, et permet en réalité un lancement plus rapide. Que préférez-vous regarder, une jolie photo ou une vue vide par défaut (ronflement)?

14
jimiHendrix

Même si cela va à l’encontre des directives mais si vous voulez toujours le faire, une meilleure approche sera préférable à un fil conducteur.

//Extend the splash screen for 3 seconds.
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];

ainsi, le thread principal n'est pas bloqué et s'il écoute toutes les notifications et autres éléments liés au réseau, il continue à fonctionner.

MISE À JOUR POUR Swift:  

 NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow:3))
14
Ankit Srivastava

Oui, le moyen le plus simple est (n'oubliez pas d'ajouter votre 'default.png' aux cibles -> [votreNomProjet]: lancez les images en 'xCode'):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [NSThread sleepForTimeInterval:3.0];
}
11
Charles Robertson

utilisez simplement le sommeil (temps en secondes); dans votre méthode applicationDidFinishedLaunching 

3
Rahul Vyas

Faites que votre application prenne plus de temps à charger.

Sérieusement, Paul Tomblin a raison de dire que ce n'est généralement pas une bonne idée. Default.png est un mécanisme destiné à donner l'impression que votre application se charge plus rapidement en conservant une capture d'écran "vide". Son utilisation pour un écran de démarrage est un abus mineur, mais rendre intentionnellement cet écran de démarrage plus long que nécessaire, il est presque malade. (Cela dégradera également votre expérience d'utilisateur. N'oubliez pas que chaque seconde que l'écran de démarrage est visible est une seconde que l'utilisateur regarde avec impatience votre logo, jurant qu'ils basculeront vers le premier concurrent décent qu'ils pourront trouver.)

Si vous essayez de couvrir un type de chargement secondaire - par exemple, si l'interface a été chargée et que vous attendez simplement d'obtenir des données du réseau - alors tout va bien, et l'approche de Ben Gottlieb va bien. Je suggérerais d'ajouter une barre de progression ou une roulette afin d'indiquer clairement à l'utilisateur que quelque chose se passe réellement.

3
Brent Royal-Gordon

Voici mon code d'écran de démarrage simple. 'splashView' est un exutoire pour une vue qui contient un logo d'image, UIActivityIndicator et un libellé "Load .." (ajoutéà mon "MainWIndow.xib" dans IB). L'indicateur d'activité est défini sur "animer" dans IB, Je crée ensuite un thread distinct pour charger les données. Une fois terminé, je supprime le SplashView et ajoute ma vue d’application normale:

-(void)applicationDidFinishLaunching:(UIApplication *)application {
    [window addSubview:splashView];
    [NSThread detachNewThreadSelector:@selector(getInitialData:) 
                                 toTarget:self withObject:nil];
}

-(void)getInitialData:(id)obj {
    [NSThread sleepForTimeInterval:3.0]; // simulate waiting for server response
    [splashView removeFromSuperview];
    [window addSubview:tabBarController.view];
}
2
wcochran

Dans Xcode 6.3, vous pouvez afficher le fichier screen.xib de lancement et même y placer un indicateur. L'écran de lancement par défaut apparaît en premier. Il est remplacé par le nib afin que l'utilisateur ne sache pas qu'il a été modifié, puis si tout est chargé, masquer il :-) 

    func showLaunchScreen() {
    // show launchscreen
    launchView = NSBundle.mainBundle().loadNibNamed("LaunchScreen", owner: self, options: nil)[0] as! UIView
    launchView.frame = self.view.bounds;
    self.view.addSubview(launchView)

    // show indicator
    launchScreenIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50)) as UIActivityIndicatorView
    launchScreenIndicator.center = CGPointMake(self.view.center.x, self.view.center.y+100)
    launchScreenIndicator.hidesWhenStopped = true
    launchScreenIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
    launchView.addSubview(launchScreenIndicator)
    self.view.addSubview(launchView)
    launchScreenIndicator.startAnimating()

    self.navigationController?.setNavigationBarHidden(self.navigationController?.navigationBarHidden == false, animated: true) //or animated: false
}

func removeLaunchScreen() {
    println("remove launchscreen")
    self.launchView.removeFromSuperview()
    self.launchScreenIndicator.stopAnimating()
    self.navigationController?.setNavigationBarHidden(false, animated: true)
}
2
ddnl
 Inside your AppDelegate.m

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // Sleep is code to stop the slash screen for 5MoreSeconds
        sleep(5);

        [self initializeStoryBoardBasedOnScreenSize];
        return YES;
    }

// VKJ

2
Vinod Joshi

J'ai fait ceci comme ci-dessous:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
    UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"splashView"];
    self.window.rootViewController = viewController;

Remarque: LaunchScreen est le scénario de lancement borad et splashView est le storyboardIdentifier

1
sagaya martin

Selon Apple HIG, vous ne devriez pas faire cela. Mais si votre application doit le faire dans un but précis, vous pouvez faire:

  • importer <unistd.h> dans votre AppDelegate.m
  • Ecrivez la ligne suivante à la première de la méthode "application didFinishLaunchingWithOptions:"

    sleep(//your time in sec goes here//);

1
x4h1d

Ecrire une classe d'écran de démarrage réelle.

Voici un écran de démarrage librement utilisable que j'ai récemment posté sur mon blog dans le blog Action: http://iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one. html

1
Shannon A.

il suffit de laisser la fenêtre dormir quelques secondes dans la méthode applicationDidFininshLaunchings

exemple: dormir (3)

1
vshall

La méthode la plus simple consiste à mettre le thread principal de votre application en mode veille pendant la période souhaitée. À condition que "Default.png" existe dans le bundle de votre application, il sera affiché aussi longtemps que le thread principal est endormi: 


-(void)applicationDidFinishLaunching:(UIApplication *)application {
    [NSThread sleepForTimeInterval:5];
    window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    [window setBackgroundColor:[UIColor yellowColor]];
    [window makeKeyAndVisible];
}

Comme vous le savez déjà, c’est une très mauvaise idée, mais cela devrait bien fonctionner ...

1
Mysliwy

Une image par défaut (default.png) s’affiche lorsque vous démarrez votre application.

Vous pouvez donc ajouter un nouveau contrôleur de vue qui affichera cette image par défaut dans l'application didFinishLoading.

Donc, par cette logique, vous affichez l'image par défaut un peu plus longtemps.

0
hites

Je conviens qu'il peut être judicieux de disposer d'un écran de démarrage au démarrage d'une application, en particulier si elle doit d'abord obtenir des données d'un site Web.

En ce qui concerne Apple HIG, jetez un coup d’œil à l’application (MobileMe) iDisk; jusqu'à ce que vous enregistriez les détails de votre membre, l'application affiche un fichier typique uitableview Default.png avant d'afficher très rapidement une vue plein écran.

0
petert

De nombreuses options ont déjà été publiées ici, mais j’ai rencontré aujourd’hui un cocoapod qui vous permet d’afficher le contenu de votre LaunchScreen.xib en tant que contrôleur de vue initial:

https://github.com/granoff/LaunchScreen (Voir aussi cet article du blog de l'auteur avec plus de détails sur la mise en œuvre .)

Cela semble être une façon assez simple de faire cela, et mieux que la grande majorité des réponses postées ici. (Bien sûr, cela n’était pas possible avant l’introduction des fichiers LaunchScreen.) Il est possible d’afficher un indicateur d’activité (ou tout autre élément de votre choix) en haut de la vue.

En ce qui concerne les raisons pour lesquelles vous voudriez faire cela, je suis surpris de constater que personne n’a mentionné le fait qu’il existe souvent des exigences concernant les éditeurs et/ou les partenaires concernant ce type de problème. C'est très courant dans les jeux, mais aussi dans les applications financées par la publicité.

Notez également que cela agit en contradiction avec le HIG, mais il en va de même pour l'attente du chargement de contenu après le lancement de votre application. Rappelez-vous que les HIG sont des directives et non des exigences.

Une dernière note: Je pense personnellement que, chaque fois qu'un écran initial comme celui-ci est mis en place, vous devriez pouvoir taper dessus pour le rejeter.

0
livingtech

Swift 2.0

Utilisez la ligne suivante dans la méthode didFinishLaunchingWithOptions: delegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    NSThread.sleepForTimeInterval(5.0)
    return true
}

Mais je recommande ceci:

Placez votre image dans un plein écran UIImageView en tant que sous-vue au-dessus de votre vue principale, couvrant ainsi votre autre interface utilisateur. Définissez une minuterie pour la supprimer après quelques secondes (éventuellement avec des effets) affichant maintenant votre application.

import UIKit
    class ViewController: UIViewController
    {
        var splashScreen:UIImageView!
        override func viewDidLoad()
        {
            super.viewDidLoad()
            self.splashScreen = UIImageView(frame: self.view.frame)
            self.splashScreen.image = UIImage(named: "Logo.png")
            self.view.addSubview(self.splashScreen)

            var removeSplashScreen = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "removeSplashImage", userInfo: nil, repeats: false)
        }
        func removeSplashImage()
        { 
            self.splashScreen.removeFromSuperview()
        }
    }
0
A.G

Version Swift:

Ajouter cette ligne dans le AppDelegate 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    NSThread.sleepForTimeInterval(2.0)//in seconds

    return true
}
0
stan

Ce que j'ai fait est présenté un contrôleur de vue modale dans l'écran initial et ensuite le fermer après plusieurs secondes

    - (void)viewDidLoad
{
    [super viewDidLoad];
    ....
  saSplash = [storyboard instantiateViewControllerWithIdentifier:@"SASplashViewController"];
    saSplash.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentModalViewController: saSplash animated:NO];
}

-(void) dismissSASplash {
    [saSplash dismissModalViewControllerAnimated:NO];

}
0
ZiggyZag

Pour un tutoriel d’écran d’écran de démarrage élégant, consultez ceci http://adeem.me/blog/2009/06/22/creating-splash-screen-tutorial-for-iphone/

0