49

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

4

24 回答 24

39

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

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

于 2009-02-16T13:53:19.710 回答
26

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

于 2009-02-16T13:53:16.683 回答
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

于 2009-05-27T04:04:57.923 回答
18

in your appDelegate , theres a method called applicationDidFinishedLaunching use a sleep function. Pass a digit in the sleep function for the no. of seconds you want to hold screen.


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

I searched so much for this thing and everybody gave their own complex point of view. I couldn't find a simple way that would just let me do it.

KISS ( Keep it simple and Smart :) I avoided the actual as its offensive.

于 2011-01-31T19:49:04.317 回答
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 nib 只是一个全屏 UIImageView,带有一个 splash png,320x480。在 1 秒的 NSTimer 之后(似乎还有更多的东西妨碍了),它会触发 timerFireMethod,这是一个自定义方法,它只调用

[self dismissModalViewControllerAnimated:YES];

然后模态 VC 只是向下滑动并离开,留下我的顶部 tableView。好消息是,当 MVC 启动时,由于模态视图控制器的独立性,底层表可以继续加载。所以,我不认为这违反了 HIG,实际上确实允许更快的启动。你更愿意看什么,一张可爱的图片,还是一个空的默认视图(打鼾)?

于 2009-10-27T17:57:19.143 回答
14

即使它违反了指导方针,但如果你仍然想这样做而不是更好的方法而不是睡眠线程

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

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

斯威夫特的更新:

 NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow:3))
于 2012-10-04T10:17:22.963 回答
11

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [NSThread sleepForTimeInterval:3.0];
}
于 2012-08-27T14:01:36.170 回答
3

使您的应用程序需要更长的时间来加载。

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

如果你试图覆盖某种二次加载——例如,如果界面已经加载并且你只是在等待从网络获取一些数据——那么它可能没问题,Ben Gottlieb 的方法很好。我建议添加一个进度条或微调器,让用户清楚地知道确实发生了一些事情。

于 2009-02-16T14:19:03.190 回答
3

只需使用睡眠(以秒为单位的时间);在您的 applicationDidFinishedLaunching 方法中

于 2009-07-18T14:32:40.993 回答
2

这是我的简单闪屏代码。'splashView' 是包含图像徽标、UIActivityIndi​​cator 和“Load..”标签(添加到我在 IB 中的“MainWIdow.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];
}
于 2009-07-13T17:31:44.583 回答
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

于 2013-11-13T03:50:42.997 回答
2

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

    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)
}
于 2015-07-19T15:22:03.493 回答
1

编写一个实际的闪屏类。

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

于 2009-03-19T23:30:17.913 回答
1

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


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

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

于 2011-01-15T16:13:59.303 回答
1

根据 Apple HIG,您不应该这样做。但是,如果您的应用程序需要出于特定目的这样做,您可以这样做:

  • 在您的 AppDelegate.m 中导入 <unistd.h>
  • 在“应用程序 didFinishLaunchingWithOptions:”方法的第一行写入以下行

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

于 2012-09-27T12:00:50.533 回答
1

只需在 applicationDidFininshLaunchings 方法中让窗口休眠几秒钟

示例:睡眠(3)

于 2012-05-16T10:48:14.327 回答
1

我这样做如下:

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

注意:LaunchScreen 是启动故事板,splashView 是故事板标识符

于 2016-12-02T10:23:00.970 回答
0

For stylish splash screen tutorial check out this http://adeem.me/blog/2009/06/22/creating-splash-screen-tutorial-for-iphone/

于 2009-06-27T08:26:49.667 回答
0

我所做的是在初始屏幕中显示一个 modalview 控制器,然后在几秒钟后将其关闭

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

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

}
于 2013-12-08T18:01:57.753 回答
0

我同意在应用程序启动时有一个启动屏幕是有意义的——尤其是如果它需要首先从网站获取一些数据。

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

于 2009-12-15T17:23:19.313 回答
0

斯威夫特 2.0

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

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

但我推荐这个:

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

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()
        }
    }
于 2016-02-11T12:27:45.343 回答
0

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

https://github.com/granoff/LaunchScreen(另请参阅作者的这篇博文,了解更多实现细节。)

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

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

另请注意,这确实与 HIG 背道而驰,但在应用程序启动后等待加载任何内容也是如此。请记住,HIG 是指导方针,而不是要求。

最后一点:这是我个人的意见,任何时候实现这样的初始屏幕,您都应该能够点击以将其关闭。

于 2015-09-23T14:32:31.990 回答
0

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

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

因此,通过这种逻辑,您可以将默认图像显示更长的时间。

于 2016-06-03T07:55:03.900 回答
0

斯威夫特版本:

在 AppDelegate 中添加这一行

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

    NSThread.sleepForTimeInterval(2.0)//in seconds

    return true
}
于 2016-08-31T10:59:06.083 回答