如何在iPhone上显示更长时间的启动画面?

时间:2009-02-16 13:41:12

标签: cocoa-touch splash-screen

如何在iPhone上显示启动画面的时间比iPhone上的默认时间长?

24 个答案:

答案 0 :(得分:39)

阅读Apple iPhone人机界面指南(HIG)。 “启动画面”不应该用于品牌标识或显示徽标,它应该看起来像应用程序的默认条件,因此它似乎可以快速启动。

让它在那里停留更长时间会违反HIG。

答案 1 :(得分:26)

最简单的方法是创建一个UIImageView,其图像是Default.png。在您的applicationDidFinishLaunching:方法中,将该图像视图添加到您的窗口,并在您希望闪屏消失时隐藏它。

答案 2 :(得分:21)

我需要这样做才能阻止显示表格视图,直到数据通过网络加载。我使用了一个我在这里找到的变体:

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

在App Delegate的界面中:


@interface AppDelegate : NSObject 
{
  UIImageView *splashView;
}

在实施中:


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

确保资源中有Default.png

答案 3 :(得分:18)

在你的appDelegate中,一个名为applicationDidFinishedLaunching的方法使用了一个sleep函数。在睡眠功能中传递一个数字为no。想要保持屏幕的几秒钟。


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

我为这件事搜索了很多,每个人都给出了他们自己复杂的观点。我找不到一个让我这么做的简单方法。

KISS(保持简单和聪明:) 我避免了实际的冒犯。

答案 4 :(得分:14)

我做得非常简单,通过让我的rootViewController推送一个modalViewController,从UIViewController的子类中的“Splash.nib”加载我称为“SplashViewController”。确切的电话是:

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

启动应用时,它会弹出,就像启动画面一样。然后,SplashViewController笔尖只是一个全屏UIImageView,带有一个启动png,320x480。经过一秒钟的NSTimer(其他任何事情似乎都妨碍了),它会触发timerFireMethod,一个只调用的自定义方法

[self dismissModalViewControllerAnimated:YES];

然后模态VC只是向下滑动,离开我的顶级tableView。好处是,当MVC启动时,由于模态视图控制器的独立性,基础表 可以继续加载 。因此,我不认为这违反了HIG,实际上确实允许更快的启动。你更喜欢看什么,一张可爱的照片,或一个空的默认视图(打鼾)?

答案 5 :(得分:14)

即使它违反了指导原则,但如果你仍然希望这样做而不是一个更好的方法而不是睡眠线程

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

这样主线程就不会被阻塞,如果它正在侦听任何通知和其他一些网络相关的东西,它仍然会继续。

SWIFT更新:

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

答案 6 :(得分:11)

是的,最简单的方法是(记得将'default.png'添加到目标 - > [yourProjectName]:在'xCode'中启动图片):

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

答案 7 :(得分:3)

让您的应用加载时间更长。

严肃地说,保罗·汤姆林是正确的,这通常不是一个好主意。 Default.png是一种机制,旨在通过持有“空”屏幕截图使您的应用看起来加载速度更快。将它用于启动画面是一种轻微的滥用,但故意让闪屏显示的时间超过其需要的时间几乎是病态。 (这也会降低您的用户体验。请记住,每隔一秒,可以看到启动画面,用户不耐烦地盯着您的徽标,发誓他们会切换到他们能找到的第一个合适的竞争对手。)

如果您正试图覆盖某种二次加载 - 例如,如果接口已加载而您只是等待从网络获取一些数据 - 那么它可能没问题,而且Ben Gottlieb的方法很好。我建议添加一个进度条或微调器,以便向用户清楚地知道某些事情正在发生。

答案 8 :(得分:3)

简单地使用睡眠(以秒为单位的时间);在你的applicationDidFinishedLaunching方法

答案 9 :(得分:2)

在Xcode 6.3中,您可以显示启动screen.xib甚至在其上放置一个指示器,首先它将显示默认启动屏幕,它被笔尖替换,因此用户不知道它已更改,然后如果一切都加载了隐藏它:-)

    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)
}

答案 10 :(得分:2)

这是我的简单启动画面代码。 'splashView'是视图的出口 包含图像徽标,UIActivityIndi​​cator和“加载..”标签(添加 在IB中我的'MainWIndow.xib'。 IB中的活动指示器设置为“动画”, 然后我生成一个单独的线程来加载数据。完成后,我删除了 splashView并添加我的正常应用程序视图:

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

答案 11 :(得分:2)

 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

答案 12 :(得分:1)

我这样做了如下:

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

注意:LaunchScreen是启动故事borad,splashView是storyboardIdentifier

答案 13 :(得分:1)

根据Apple HIG,你不应该这样做。但是,如果您的应用程序需要为了明确的目的而这样做,您可以这样做:

  • import< unistd.h>在你的AppDelegate.m
  • 在“application didFinishLaunchingWithOptions:”方法的第一个方法中写下以下行

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

答案 14 :(得分:1)

在applicationDidFininshLaunchings方法

中让窗口休眠几秒钟

示例:sleep(3)

答案 15 :(得分:1)

最简单的方法是将应用程序的主线程置于所需的一段时间内进入睡眠模式。如果您的应用程序包中存在“Default.png”,只要主线程处于睡眠状态,它就会显示:


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

正如您已经知道的那样,这是一个非常糟糕的主意,但它应该可以正常工作......

答案 16 :(得分:1)

写一个实际的启动画面类。

这是我最近在iPhone动态博客中发布的可自由使用的启动画面: http://iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one.html

答案 17 :(得分:0)

我同意在应用启动时拥有启动画面是有意义的 - 特别是如果它需要首先从网站获取一些数据。

就Apple HIG而言 - 看看(MobileMe)iDisk应用程序;在您注册会员详细信息之前,应用会在快速显示全屏视图之前显示典型的uitableview Default.png。

答案 18 :(得分:0)

我所做的是在初始屏幕中显示模态视图控制器,然后在几秒后将其关闭

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

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

}

答案 19 :(得分:0)

对于时尚的闪屏教程,请查看此内容 http://adeem.me/blog/2009/06/22/creating-splash-screen-tutorial-for-iphone/

答案 20 :(得分:0)

此处已经发布了很多选项,但今天我遇到了cocoapod,它允许您显示LaunchScreen.xib的内容作为初始视图控制器:

https://github.com/granoff/LaunchScreen(另见blog post from the author with more implementation details。)

这似乎是一种相当直接的方式,并且比这里发布的绝大多数答案更好。 (当然,除非首先引入LaunchScreen文件,否则无法实现。)可以在视图顶部显示活动指示符(或任何您想要的其他内容)。

至于你为什么要这样做,我很惊讶没有人提到过这类事情经常有出版商和/或合作伙伴的要求。它在游戏中非常常见,但也是广告资助的应用程序。

另请注意,这确实与HIG相反,但在应用程序启动后等待加载任何内容的情况也是如此。请记住,HIG是指导原则,而不是要求。

最后一点说明:我的个人意见是,无论何时实施这样的初始屏幕,您都应该可以点按它来解雇它。

答案 21 :(得分:0)

Swift 2.0

在didFinishLaunchingWithOptions中使用以下行:委托方法:

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

但我建议这样做:

将您的图像放在UIImageView全屏幕中,作为主视图顶部的子视图,从而覆盖其他UI。设置一个计时器,在几秒钟后(可能带有效果)将其移除,现在显示您的应用程序。

//  MasterViewController.h
        .
        .
        .

        - (IBAction)btMy:(id)sender;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *btMy;


        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt1;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt2;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt3;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt4;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt5;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt6;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt7;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *bt8;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl1;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl2;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl3;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl4;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl5;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl6;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl7;
        @property (weak, nonatomic) IBOutlet UIBarButtonItem *fl8;
        @end

        //  MasterViewController.m
        .
        .
        .
    @interface MasterViewController ()
    { 
        BOOL tt;
    }
    .
    .
    .
       - (IBAction)btMy:(id)sender {
        [self nextToolBar];

    } 

        -(void) nextToolBar {
         if (tt ) {
                self.navigationController.toolbar.items = [NSArray arrayWithObjects:_bt1, _fl1, _bt2, _fl1, _bt3, _fl1, _bt4, _fl1, _btMy, nil];
                tt = NO;
            }else{
                self.navigationController.toolbar.items = [NSArray arrayWithObjects:  _bt5, _fl1, _bt6,_fl1,_bt7,_fl1, _bt8, _fl1, _btMy, nil];
                tt = YES;
                 }

            for ( NSInteger x = 0; x < 8; x++){ // если при перевороте цвет меняли на прозрачный, востанавливаем обратно

                [self.navigationController.toolbar.items[x] setTintColor:_btMy.tintColor];
            }

        }

        -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ // после смены орентации устройства
           [self nextToolBar]; // показываем кнопки 4+1 иначе отображается все кнопки 8+1 шт

        }

        -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration{ // до смены арентауции устройства
            NSArray *myArray = [NSArray arrayWithObjects:_bt1, _bt2, _bt3, _bt4, _bt5, _bt6, _bt7, _bt8, nil]; // перед переворотом экрана меняем цвет на прозрачный
            for ( NSInteger x = 0; x < 8; x++){

                [myArray[x] setTintColor:[UIColor clearColor]];  //  
                 }
            if (tt) {tt=NO;} else {tt=YES;}   // чтобы вернуться на тот же набор кнопок
        }

答案 22 :(得分:0)

启动应用程序时会显示默认图像(default.png)。

因此,您可以添加一个新的viewcontroller,它将在应用程序didFinishLoading中显示该默认图像。

因此,通过此逻辑,您可以显示默认图像一段时间。

答案 23 :(得分:0)

Swift版本:

在AppDelegate中添加此行

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

    NSThread.sleepForTimeInterval(2.0)//in seconds

    return true
}