iPhone で既定の時間よりも長い時間スプラッシュ スクリーンを表示するにはどうすればよいですか?
24 に答える
Apple iPhoneヒューマンインターフェイスガイドライン(HIG)をお読みください。「スプラッシュ画面」は、ロゴをブランド化または表示するためのものではなく、アプリのデフォルトの状態のように見えるため、すぐに起動するように見えます。
それをより長くそこにとどまらせることは、HIGの違反となるでしょう。
これを行う最も簡単な方法は、画像がDefault.pngであるUIImageViewを作成することです。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 があることを確認してください
appDelegate には、スリープ機能を使用する applicationDidFinishedLaunching というメソッドがあります。no のスリープ関数に数字を渡します。画面を保持したい秒数。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[window makeKeyAndVisible];
[window addSubview:viewController.view];
sleep(5);
return YES;
}
私はこのことをたくさん探しましたが、誰もが独自の複雑な視点を持っていました. 私はそれをさせてくれる簡単な方法を見つけることができませんでした。
KISS ( シンプルでスマートに保つ :) 私は攻撃的なので実際を避けました。
rootViewController に modalViewController をプッシュさせ、「SplashViewController」と呼ばれる UIViewController のサブクラスの「Splash.nib」からロードすることで、非常に簡単に実行しました。正確な呼び出しは次のとおりです。
- (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 は、320x480 のスプラッシュ png を持つフルスクリーンの UIImageView です。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は、「空の」スクリーンショットを保持することで、アプリの読み込みを高速化することを目的としたメカニズムです。スプラッシュ画面に使用することは軽微な悪用ですが、意図的にそのスプラッシュ画面を必要以上に長く表示させることはほとんど病気です。(ユーザーエクスペリエンスも低下します。スプラッシュ画面が表示されるのは、ユーザーがあなたのロゴをじっと見つめている秒であり、見つけた最初のまともな競合他社に切り替わると誓っていることを忘れないでください。)
ある種の二次的な読み込みをカバーしようとしている場合(たとえば、インターフェイスが読み込まれ、ネットワークからデータを取得するのを待っている場合)、それはおそらく問題ありません。BenGottliebのアプローチは問題ありません。何かが実際に起こっていることをユーザーに明確にするために、プログレスバーまたはスピナーを追加することをお勧めします。
単にsleep(秒単位の時間)を使用します。アプリケーションでDidFinishedLaunchingメソッド
これが私の単純なスプラッシュ画面のコードです。「splashView」は、イメージ ロゴ、UIActivityIndicator、および「Load..」ラベル (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];
}
Xcode 6.3 では、launch 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)
}
applicationDidFininshLaunchingsメソッドでウィンドウを数秒間スリープさせるだけです
例:sleep(3)
実際のスプラッシュ スクリーン クラスを記述します。
これは、私が最近 iPhone in Action ブログに投稿した、自由に使用できるスプラッシュ スクリーンです 。
Apple HIG によると、それを行うべきではありません。ただし、アプリケーションが明確な目的のためにそうする必要がある場合は、次のことができます。
- <unistd.h> を AppDelegate.m にインポートします
「application didFinishLaunchingWithOptions:」メソッドの最初に次の行を記述します。
sleep(//your time in sec goes here//)
;
最も簡単な方法は、アプリケーションのメイン スレッドを必要な時間だけスリープ モードにすることです。アプリケーションのバンドルに "Default.png" が存在する場合、メイン スレッドがスリープ状態である限り表示されます。
-(void)applicationDidFinishLaunching:(UIApplication *)application {
[NSThread sleepForTimeInterval:5];
window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[window setBackgroundColor:[UIColor yellowColor]];
[window makeKeyAndVisible];
}
すでにお気づきのように、これを行うのは非常に悪い考えですが、問題なく動作するはずです...
スイフト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()
}
}
ここにはすでに多くのオプションが投稿されていますが、今日LaunchScreen.xib
、初期ビュー コントローラーとしてコンテンツを表示できる cocoapod に遭遇しました。
https://github.com/granoff/LaunchScreen (実装の詳細については、著者によるこのブログ投稿も参照してください。)
これは、これを行うためのかなり簡単な方法のようであり、ここに投稿された回答の大部分よりも優れています。(もちろん、LaunchScreen
そもそもファイルが導入されるまでは可能ではありませんでした。) ビューの上にアクティビティ インジケーター (またはその他の必要なもの) を表示することができます。
なぜこれを行いたいのかというと、この種のことに関して、多くの場合、パブリッシャーやパートナーの要件があることに誰も言及していないことに驚いています。ゲームでは非常に一般的ですが、広告資金によるアプリケーションでも同様です。
また、これは HIG に反して動作しますが、アプリケーションの起動後にコンテンツの読み込みを待機することにも注意してください。HIG はガイドラインであり、要件ではないことに注意してください。
最後に 1 つ: 個人的な意見ですが、このような初期画面が実装されている場合はいつでも、タップして閉じることができるはずです。
私がしたことは、最初の画面にモーダルビューコントローラーが表示され、数秒後にそれを閉じることです
- (void)viewDidLoad
{
[super viewDidLoad];
....
saSplash = [storyboard instantiateViewControllerWithIdentifier:@"SASplashViewController"];
saSplash.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentModalViewController: saSplash animated:NO];
}
-(void) dismissSASplash {
[saSplash dismissModalViewControllerAnimated:NO];
}
迅速なバージョン:
この行を AppDelegate に追加します
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
NSThread.sleepForTimeInterval(2.0)//in seconds
return true
}
アプリの起動時にスプラッシュ スクリーンを表示するのは理にかなっていることに同意します。特に、最初に Web サイトからデータを取得する必要がある場合はそうです。
Apple HIG に従う限り - (MobileMe) iDisk アプリを見てください。メンバーの詳細を登録するまで、アプリは典型的な uitableview Default.png を表示してから、すぐにフルスクリーン ビューを表示します。
アプリを起動すると、デフォルトの画像 (default.png) が表示されます。
そのため、アプリケーション didFinishLoading でデフォルトの画像を表示する新しいビューコントローラーを追加できます。
したがって、このロジックにより、デフォルトの画像が少し長く表示されます。
スタイリッシュなスプラッシュ スクリーンのチュートリアルについては、http://adeem.me/blog/2009/06/22/creating-splash-screen-tutorial-for-iphone/ を ご覧ください。