如何在 iPhone 上显示比默认时间更长的启动画面?
24 回答
阅读 Apple iPhone 人机界面指南 (HIG)。“启动屏幕”不应该用于品牌或显示徽标,它应该看起来像应用程序的默认状态,因此它看起来可以快速启动。
让它在那里停留更长时间将违反HIG。
最简单的方法是创建一个 UIImageView,其图像是您的 Default.png。在您的 applicationDidFinishLaunching: 方法中,将该图像视图添加到您的窗口,并在您希望启动屏幕消失时将其隐藏。
我需要这样做以阻止显示表视图,直到通过网络加载数据。我使用了我在这里找到的一个变体:
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
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.
我做得很简单,通过让我的 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,实际上确实允许更快的启动。你更愿意看什么,一张可爱的图片,还是一个空的默认视图(打鼾)?
即使它违反了指导方针,但如果你仍然想这样做而不是更好的方法而不是睡眠线程
//Extend the splash screen for 3 seconds.
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];
这样主线程就不会被阻塞,如果它正在监听任何通知和其他一些与网络相关的东西,它仍然会继续。
斯威夫特的更新:
NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow:3))
是的,最简单的方法是(记住将“default.png”添加到目标 -> [yourProjectName]:在“xCode”中启动图像):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[NSThread sleepForTimeInterval:3.0];
}
使您的应用程序需要更长的时间来加载。
严肃地说,Paul Tomblin 是正确的,这通常不是一个好主意。Default.png 是一种机制,旨在通过保持“空”屏幕截图使您的应用看起来加载速度更快。将它用于启动画面是一种轻微的滥用,但故意使启动画面出现的时间超过它需要的时间几乎是病态的。(它还会降低您的用户体验。请记住,启动屏幕可见的每一秒都是用户不耐烦地盯着您的徽标,发誓他们会切换到他们能找到的第一个体面的竞争对手的一秒。)
如果你试图覆盖某种二次加载——例如,如果界面已经加载并且你只是在等待从网络获取一些数据——那么它可能没问题,Ben Gottlieb 的方法很好。我建议添加一个进度条或微调器,让用户清楚地知道确实发生了一些事情。
只需使用睡眠(以秒为单位的时间);在您的 applicationDidFinishedLaunching 方法中
这是我的简单闪屏代码。'splashView' 是包含图像徽标、UIActivityIndicator 和“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];
}
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
在 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)
}
编写一个实际的闪屏类。
这是我最近在我的 iPhone in Action 博客中发布的可免费使用的启动画面:http: //iphoneinaction.manning.com/iphone_in_action/2009/03/creating-a-splash-screen-part-one.html
最简单的方法是将应用程序的主线程置于睡眠模式一段所需的时间。假设“Default.png”存在于您的应用程序包中,只要主线程处于睡眠状态,它就会一直显示:
-(void)applicationDidFinishLaunching:(UIApplication *)application {
[NSThread sleepForTimeInterval:5];
window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[window setBackgroundColor:[UIColor yellowColor]];
[window makeKeyAndVisible];
}
正如您已经意识到的那样,这是一个非常糟糕的主意,但它应该可以正常工作......
根据 Apple HIG,您不应该这样做。但是,如果您的应用程序需要出于特定目的这样做,您可以这样做:
- 在您的 AppDelegate.m 中导入 <unistd.h>
在“应用程序 didFinishLaunchingWithOptions:”方法的第一行写入以下行
sleep(//your time in sec goes here//)
;
只需在 applicationDidFininshLaunchings 方法中让窗口休眠几秒钟
示例:睡眠(3)
我这样做如下:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"splashView"];
self.window.rootViewController = viewController;
注意:LaunchScreen 是启动故事板,splashView 是故事板标识符
For stylish splash screen tutorial check out this http://adeem.me/blog/2009/06/22/creating-splash-screen-tutorial-for-iphone/
我所做的是在初始屏幕中显示一个 modalview 控制器,然后在几秒钟后将其关闭
- (void)viewDidLoad
{
[super viewDidLoad];
....
saSplash = [storyboard instantiateViewControllerWithIdentifier:@"SASplashViewController"];
saSplash.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentModalViewController: saSplash animated:NO];
}
-(void) dismissSASplash {
[saSplash dismissModalViewControllerAnimated:NO];
}
我同意在应用程序启动时有一个启动屏幕是有意义的——尤其是如果它需要首先从网站获取一些数据。
至于关注 Apple HIG - 看看 (MobileMe) iDisk 应用程序;在您注册会员详细信息之前,该应用程序会在快速显示全屏视图之前显示典型的 uitableview Default.png。
斯威夫特 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()
}
}
这里已经发布了很多选项,但是我今天遇到了 cocoapod,它允许您将您的内容显示LaunchScreen.xib
为初始视图控制器:
https://github.com/granoff/LaunchScreen(另请参阅作者的这篇博文,了解更多实现细节。)
这似乎是一种相当直接的方法,并且比此处发布的绝大多数答案更好。(当然,直到LaunchScreen
首先引入文件才可能实现。)可以在视图顶部显示活动指示器(或您想要的任何其他内容)。
至于您为什么要这样做,令我惊讶的是,没有人提到围绕这类事情经常有出版商和/或合作伙伴的要求。这在游戏中很常见,但广告资助的应用程序也是如此。
另请注意,这确实与 HIG 背道而驰,但在应用程序启动后等待加载任何内容也是如此。请记住,HIG 是指导方针,而不是要求。
最后一点:这是我个人的意见,任何时候实现这样的初始屏幕,您都应该能够点击以将其关闭。
启动应用程序时会显示默认图像 (default.png)。
因此,您可以添加一个新的视图控制器,它将在应用程序 didFinishLoading 中显示该默认图像。
因此,通过这种逻辑,您可以将默认图像显示更长的时间。
斯威夫特版本:
在 AppDelegate 中添加这一行
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
NSThread.sleepForTimeInterval(2.0)//in seconds
return true
}