web-dev-qa-db-ger.com

Wie kann ich einen Begrüßungsbildschirm länger auf einem iPhone anzeigen?

Wie kann ich einen Begrüßungsbildschirm länger als die Standardzeit auf einem iPhone anzeigen?

49
Shofiur

Lesen Sie die Apple iPhone Human Interface Guidelines (HIG). Der "Begrüßungsbildschirm" soll nicht zum Branding oder Anzeigen eines Logos dienen, sondern sollte wie die Standardbedingung der App aussehen.

Wenn es länger dort bleiben würde, wäre dies ein Verstoß gegen die HIG.

39
Paul Tomblin

Am einfachsten ist es, ein UIImageView zu erstellen, dessen Image Ihr Default.png ist. Fügen Sie in Ihrer applicationDidFinishLaunching: -Methode die Bildansicht zu Ihrem Fenster hinzu und blenden Sie sie aus, wenn der Begrüßungsbildschirm nicht mehr angezeigt wird.

26
Ben Gottlieb

Ich musste dies tun, um die Anzeige einer Tabellenansicht zu blockieren, bis die Daten über das Netzwerk geladen wurden. Ich habe eine Variante verwendet, die ich hier gefunden habe:

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

In der Benutzeroberfläche Ihres App-Delegierten:


@interface AppDelegate : NSObject 
{
  UIImageView *splashView;
}

Bei der Umsetzung:


@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];
}

Stellen Sie sicher, dass in den Ressourcen ein Default.png vorhanden ist

21
nevan king

in Ihrem appDelegate verwenden Sie eine Methode namens applicationDidFinishedLaunching, die eine Sleep-Funktion verwendet. Übergeben Sie in der Sleep-Funktion eine Ziffer für die Nr. Sekunden, die Sie den Bildschirm halten möchten.


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

Ich habe so sehr nach diesem Ding gesucht und jeder hat seinen eigenen komplexen Standpunkt angegeben. Ich konnte keinen einfachen Weg finden, mit dem ich es einfach tun würde.

KISS (Keep it simple and Smart :) Ich habe das eigentliche als seine Offensive vermieden.

18
Taimur Ajmal

Ich habe es ziemlich einfach gemacht, indem ich meinen rootViewController einen ModalViewController schieben ließ, der von "Splash.nib" in einer Unterklasse von UIViewController geladen wurde und ich "SplashViewController" nannte. Der genaue Anruf war:

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

Wenn Sie die App starten, wird sie wie ein Startbildschirm angezeigt. Dann ist die SplashViewController-Spitze nur eine Vollbild-UIImageView mit einem Splashpng, 320x480. Nach einem 1-sekündigen NSTimer (was mehr schien, störte es), wird der TimerFireMethod ausgelöst, eine benutzerdefinierte Methode, die nur aufgerufen wird

[self dismissModalViewControllerAnimated:YES];

Dann wird der modale VC einfach nach unten verschoben und verlässt meine oberste TableView. Das Schöne ist, während der MVC oben ist, der darunterliegende Tisch kann weiter laden aufgrund der unabhängigen Natur der Modal-View-Controller. Ich glaube nicht, dass dies die HIGs verletzt und tatsächlich einen schnelleren Start ermöglicht. Was würdest du lieber anschauen, ein süßes Bild oder eine leere Standardansicht (Schnarchen)?

14
jimiHendrix

Es ist zwar gegen die Richtlinien, aber wenn Sie dies dennoch tun möchten, ist dies ein besserer Ansatz als Schlafthread

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

auf diese Weise wird der Haupt-Thread nicht blockiert, und wenn er auf Benachrichtigungen und andere netzwerkbezogene Daten wartet, wird er trotzdem fortgesetzt.

UPDATE FOR Swift:  

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

Ja, der einfachste Weg ist (vergessen Sie nicht, 'default.png' zu Zielen hinzuzufügen -> [IhrProjektname]: Starten Sie Bilder in 'xCode'):

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

verwenden Sie einfach den Schlaf (Zeit in Sekunden); in Ihrer applicationDidFinishedLaunching-Methode 

3
Rahul Vyas

Das Laden der App dauert länger.

Im Ernst ist Paul Tomblin richtig, dass dies normalerweise keine gute Idee ist. Default.png ist ein Mechanismus, durch den Ihre App schneller geladen werden soll, wenn Sie einen "leeren" Screenshot halten. Die Verwendung für einen Begrüßungsbildschirm ist ein geringfügiger Missbrauch, aber wenn man den Begrüßungsbildschirm absichtlich länger als nötig erscheinen lässt, ist er fast krank. (Dadurch wird auch die Benutzererfahrung beeinträchtigt. Denken Sie daran, dass jede Sekunde, die der Startbildschirm sichtbar ist, eine Sekunde ist, in der der Benutzer ungeduldig auf Ihr Logo starrt.

Wenn Sie versuchen, eine Art sekundärer Belastung zu bewältigen - beispielsweise, wenn die Schnittstelle geladen wurde und Sie nur darauf warten, Daten aus dem Netzwerk zu erhalten -, ist dies wahrscheinlich in Ordnung und der Ansatz von Ben Gottlieb ist in Ordnung. Ich würde vorschlagen, einen Fortschrittsbalken oder einen Spinner hinzuzufügen, um dem Benutzer klar zu machen, dass wirklich etwas passiert.

3

Hier ist mein einfacher Begrüßungsbildschirm-Code. 'splashView' ist ein Auslass für eine Ansicht .__, die ein Image-Logo, einen UIActivityIndicator und ein Label "Load .." enthält (hinzugefügt zu meiner 'MainWIndow.xib' in IB). Der Aktivitätsindikator wird in IB, .__, auf "animieren" gesetzt. Ich zeige dann einen separaten Thread, um die Daten zu laden. Wenn ich fertig bin, entferne ich die SplashView und füge meine normale Anwendungsansicht hinzu:

-(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

In Xcode 6.3 können Sie den Startbildschirm.xib anzeigen und sogar einen Indikator darauf setzen. Zuerst wird der Standardstartbildschirm angezeigt. Er wird durch die Spitze ersetzt, sodass der Benutzer nicht weiß, dass er sich geändert hat, und ob alles geladen ist es :-) 

    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

Ich habe das wie folgt gemacht:

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

Hinweis: LaunchScreen ist die Startgeschichte und splashView ist der Storyboard-Identifikator

1
sagaya martin

Laut dem Apple HIG solltest du das nicht tun. Wenn Ihre Anwendung dies jedoch für einen bestimmten Zweck benötigt, können Sie Folgendes tun:

  • importieren Sie <unistd.h> in Ihre AppDelegate.m
  • Schreiben Sie die folgende Zeile an der ersten Stelle der Methode "application didFinishLaunchingWithOptions:"

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

1
x4h1d

Schreiben Sie eine tatsächliche Begrüßungsbildschirmklasse.

Hier ist ein frei verwendbarer Begrüßungsbildschirm, den ich kürzlich in meinem iPhone im Action-Blog veröffentlicht habe: http://iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one. html

1
Shannon A.

lassen Sie das Fenster in der applicationDidFininshLaunchings-Methode für einige Sekunden schlafen

beispiel: Schlaf (3)

1
vshall

Am einfachsten ist es, den Haupt-Thread Ihrer Anwendung für einen gewünschten Zeitraum in einen Schlafmodus zu versetzen. Sofern "Default.png" im Bundle Ihrer Anwendung vorhanden ist, wird es solange angezeigt, wie der Haupt-Thread schläft: 


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

Wie Sie bereits wissen, ist das eine schrecklich schlechte Idee, aber es sollte gut funktionieren ...

1
Mysliwy

Beim Starten Ihrer App wird ein Standardbild (default.png) angezeigt.

Sie können also einen neuen Viewcontroller hinzufügen, der das Standardbild in der Anwendung didFinishLoading anzeigt.

Nach dieser Logik zeigen Sie das Standardbild etwas länger an.

0
hites

Ich stimme zu, dass es sinnvoll sein kann, wenn beim Start einer App ein Begrüßungsbildschirm angezeigt wird - insbesondere, wenn zuvor Daten von einer Website abgerufen werden müssen.

Wenn Sie Apple HIG folgen, werfen Sie einen Blick auf die (MobileMe) iDisk-App. Bis Sie Ihre Mitgliedsdaten registrieren, zeigt die App eine typische uitableview Default.png an, bevor sie sehr schnell eine Vollbildansicht anzeigt.

0
petert

Es gibt viele Optionen, die hier bereits veröffentlicht wurden, aber ich bin heute auf cocoapod gestoßen, mit dem Sie den Inhalt Ihres LaunchScreen.xib als anfänglichen View-Controller anzeigen können:

https://github.com/granoff/LaunchScreen (Siehe auch diesen Blogbeitrag des Autors mit weiteren Implementierungsdetails .)

Dies scheint ein ziemlich direkter Weg, dies zu tun, und besser als die überwiegende Mehrheit der hier veröffentlichten Antworten. (Natürlich war dies erst bei der Einführung von LaunchScreen-Dateien möglich.) Es ist möglich, eine Aktivitätsanzeige (oder etwas anderes, was Sie möchten) auf der Ansicht anzuzeigen.

Ich bin erstaunt darüber, warum Sie dies tun möchten. Niemand hat erwähnt, dass es häufig Anforderungen an Herausgeber und/oder Partner in dieser Hinsicht gibt. Es ist sehr üblich bei Spielen, aber auch werbefinanzierte Anwendungen.

Beachten Sie auch, dass dies der HIG zuwiderläuft, aber das Warten auf das Laden von Inhalten nach dem Starten Ihrer Anwendung. Denken Sie daran, dass die HIG Richtlinien und keine Anforderungen sind.

Eine letzte Anmerkung: Meine persönliche Meinung ist, dass Sie jedes Mal, wenn ein derartiger Anfangsbildschirm implementiert wird, darauf zugreifen können, um ihn zu verwerfen.

0
livingtech

Swift 2.0

Verwenden Sie folgende Zeile in didFinishLaunchingWithOptions: Delegate-Methode:

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

Aber ich empfehle das:

Platzieren Sie Ihr Bild in einem UIImageView-Vollbildmodus als Unteransicht oben in der Hauptansicht und decken Sie damit Ihre andere Benutzeroberfläche ab. Stellen Sie einen Timer ein, um ihn nach einigen Sekunden (möglicherweise mit Effekten) zu entfernen. Jetzt wird Ihre Anwendung angezeigt.

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

Swift-Version:

Fügen Sie diese Zeile in AppDelegate hinzu 

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

    NSThread.sleepForTimeInterval(2.0)//in seconds

    return true
}
0
stan

Was ich gemacht habe, ist, einen modalen View-Controller auf dem Startbildschirm darzustellen und ihn nach einigen Sekunden zu schließen

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

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

}
0
ZiggyZag

Für ein stilvolles Startbildschirm-Tutorial sehen Sie dieses http://adeem.me/blog/2009/06/22/creating-splash-screen-tutorial-for-iphone/