web-dev-qa-db-ja.com

iOS 7の起動画像(スプラッシュスクリーン)がフェードアウトする

IOS 7では、アプリが読み込まれると、起動画像がすぐに消えるのではなく、フェードアウトします。

この起動画像のフェードアウトアニメーションを防ぐ設定はありますか? iOS 6以前と同じようにすぐに消える必要があります。

回答の編集:

はい、スプラッシュ画像をUIImageViewとして上部のウィンドウに追加し、スプラッシュフェードアニメーションの完了後に非表示にすることができます。ただし、これにより0.4秒の遅延が発生するため、回避しようとしています。

39
erkanyildiz

IOS 12以降、スプラッシュスクリーンのフェードアウトアニメーションを無効にすることはまだできません。

0
erkanyildiz

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;
}
6
Alex R. R.

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];
    });
}
4
Patrick

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」メソッドを使用できます。問題さえ。

3
thgc

それが実際のコードである場合、イメージ名にタイプミスがある可能性があります。 (そうでない場合は、「機能しない」の意味を教えてください。)

また、スプラッシュスクリーンは通常すべての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;
}
2
bLacK hoLE

Cocos2Dアプリに関連するPatrickの回答を確認し、さらにいくつかの詳細を追加したかっただけです。

6.1シミュレーターと7.xシミュレーターを切り替えると、動作は確かに簡単に確認できます。最初の切り替えは(同じ理由で、おそらく黒く点滅します)、7.xシミュレーターは遅いです迷惑なフェードインして黒になり、続いてCocos2Dシーンが点滅します。

CCDirectorのものを変更またはサブクラス化したくない場合は、彼の同じコードを使用してAppDelegateを変更することもできます。私たちの場合、それは非常に簡単でした:

  1. AppDidFinishLaunchingでは、glViewが作成されるまで待機してから、UIImageをサブビューとして追加します。
  2. 次に、「postDidFinish ...」ルーチンを作成し、0.1f秒ほど後にそれを呼び出すselectSelectorを実行します。その中で、同じコードを使用してremoveFromSubviewを作成できます。

これは、CCDirectorクラスに追加するほどエレガントではなく、見えませんが、簡単な修正として簡単に取得できます。

1
TomRicket