IOS 7では、アプリが読み込まれると、起動画像がすぐに消えるのではなく、フェードアウトします。
この起動画像のフェードアウトアニメーションを防ぐ設定はありますか? iOS 6以前と同じようにすぐに消える必要があります。
回答の編集:
はい、スプラッシュ画像をUIImageViewとして上部のウィンドウに追加し、スプラッシュフェードアニメーションの完了後に非表示にすることができます。ただし、これにより0.4秒の遅延が発生するため、回避しようとしています。
IOS 12以降、スプラッシュスクリーンのフェードアウトアニメーションを無効にすることはまだできません。
AppControllerでなんとかしました。 glViewの作成直後にこのコードを配置するだけです
UIImage* image = [UIImage imageNamed:[self getLaunchImageName]];
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
float screenScale = [[UIScreen mainScreen] scale];
if (screenScale > 1.)
image = [UIImage imageWithCGImage:image.CGImage scale:screenScale orientation:image.imageOrientation];
}
UIImageView *splashView = [[UIImageView alloc] initWithImage:image];
[viewController.view addSubview:splashView];
[splashView performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.1f];
簡単です。起動画像を取得して、しばらくすると表示されなくなります。 getLaunchImageコードが必要になります( このコメントに基づいて 、iPhone 6でも6 plusでもテストされていません)
-(NSString*)getLaunchImageName
{
NSArray* images= @[@"LaunchImage.png",
@"[email protected]",
@"[email protected]",
@"[email protected]",
@"[email protected]",
@"LaunchImage-700-Portrait@2x~ipad.png",
@"LaunchImage-Portrait@2x~ipad.png",
@"LaunchImage-700-Portrait~ipad.png",
@"LaunchImage-Portrait~ipad.png",
@"LaunchImage-Landscape@2x~ipad.png",
@"LaunchImage-700-Landscape@2x~ipad.png",
@"LaunchImage-Landscape~ipad.png",
@"LaunchImage-700-Landscape~ipad.png",
@"[email protected]",
@"[email protected]",
@"[email protected]",
];
UIImage *splashImage;
if ([self isDeviceiPhone])
{
if ([self isDeviceiPhone4] && [self isDeviceRetina])
{
splashImage = [UIImage imageNamed:images[1]];
if (splashImage.size.width!=0)
return images[1];
else
return images[2];
}
else if ([self isDeviceiPhone5])
{
splashImage = [UIImage imageNamed:images[1]];
if (splashImage.size.width!=0)
return images[3];
else
return images[4];
}
else if ([self isDeviceiPhone6])
{
splashImage = [UIImage imageNamed:images[1]];
if (splashImage.size.width!=0)
return images[13];
else
return images[14];
}
else
return images[0]; //Non-retina iPhone
}
else if ([[UIDevice currentDevice] orientation]==UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown)//iPad Portrait
{
if ([self isDeviceRetina])
{
splashImage = [UIImage imageNamed:images[5]];
if (splashImage.size.width!=0)
return images[5];
else
return images[6];
}
else
{
splashImage = [UIImage imageNamed:images[7]];
if (splashImage.size.width!=0)
return images[7];
else
return images[8];
}
}
else
{
if ([self isDeviceRetina])
{
splashImage = [UIImage imageNamed:images[9]];
if (splashImage.size.width!=0)
return images[9];
else
return images[10];
}
else
{
splashImage = [UIImage imageNamed:images[11]];
if (splashImage.size.width!=0)
return images[11];
else
return images[12];
}
}
}
-(BOOL)isDeviceiPhone
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
return TRUE;
}
return FALSE;
}
-(BOOL)isDeviceiPhone4
{
if ([[UIScreen mainScreen] bounds].size.height==480)
return TRUE;
return FALSE;
}
-(BOOL)isDeviceRetina
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([UIScreen mainScreen].scale == 2.0)) // Retina display
{
return TRUE;
}
else // non-Retina display
{
return FALSE;
}
}
-(BOOL)isDeviceiPhone5
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && [[UIScreen mainScreen] bounds].size.height==568)
{
return TRUE;
}
return FALSE;
}
-(BOOL)isDeviceiPhone6
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && [[UIScreen mainScreen] bounds].size.height>568)
{
return TRUE;
}
return FALSE;
}
IOS 7では、スプラッシュ画面は、スプラッシュ画像から最初のUIViewにフェードトランジションします。そのUIViewがスプラッシュスクリーンと同一に見える場合、フェードは発生しません。問題は、Cocos2Dの初期ビューが真っ黒であるということです。
残念ながら、これを解決するために私が見つけた唯一の方法は、スプラッシュ画像と同じUIImageViewを1秒間実際に追加し、Cocos2Dが描画を開始したらそれを削除することでした。
CCDirectorIOS(またはサブクラス):
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_WIDESCREEN (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height > 567.0f)
static const NSInteger tempSplashViewTag = 87624;
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSString *spriteName = IS_IPAD ? @"Default-Landscape" : IS_WIDESCREEN ? @"Default-568h" : @"Default";
UIImageView *splashView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:spriteName]];
splashView.tag = tempSplashViewTag;
[self.view addSubview:splashView];
[self startAnimation];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
UIView *splashView = [self.view viewWithTag:tempSplashViewTag];
[splashView removeFromSuperview];
});
}
Cocos2D-xでアプリを開発し、メインウィンドウとOpenGLコンテンツを初期化するのと同じ問題がありました。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
代わりに私はそれをメソッドに移動しました
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
そして今、それはもはや「フェード」しません。 didの代わりにwillに注意してください。このメソッドはiOS6以降で使用できます。したがって、アプリをiOS5.x以下と互換性があるようにしたい場合は、<__IPHONE_6_0のプリプロセッサバージョンチェックを行い、「didFinishLaunching」メソッドを使用できます。問題さえ。
それが実際のコードである場合、イメージ名にタイプミスがある可能性があります。 (そうでない場合は、「機能しない」の意味を教えてください。)
また、スプラッシュスクリーンは通常すべてのapplicationDidBecomeActive:に表示されるわけではありません。 didFinishLaunchingWithOptions:は、起動され、スプラッシュスクリーンが表示されていたことを知っている時間です。
-(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[UIView animateWithDuration:0.2
delay:0
options: UIViewAnimationCurveEaseIn // change effect here.
animations:^{
self.window.viewForBaselineLayout.alpha = 0; // and at this alpha
}
completion:^(BOOL finished){
}];
return YES;
}
Cocos2Dアプリに関連するPatrickの回答を確認し、さらにいくつかの詳細を追加したかっただけです。
6.1シミュレーターと7.xシミュレーターを切り替えると、動作は確かに簡単に確認できます。最初の切り替えは(同じ理由で、おそらく黒く点滅します)、7.xシミュレーターは遅いです迷惑なフェードインして黒になり、続いてCocos2Dシーンが点滅します。
CCDirectorのものを変更またはサブクラス化したくない場合は、彼の同じコードを使用してAppDelegateを変更することもできます。私たちの場合、それは非常に簡単でした:
これは、CCDirectorクラスに追加するほどエレガントではなく、見えませんが、簡単な修正として簡単に取得できます。