iOS 7启动图像(闪屏)淡出

在iOS 7上,启动图像淡出,而不是在应用程序加载时立即消失。

有没有什么设置来防止这个启动图像淡出animation? 我需要它立即消失,就像在iOS 6和更早的版本。

编辑答案:

是的,可以将初始图像作为UIImageView添加到顶部窗口,并在完成初始化淡出animation之后将其隐藏。 但是这会导致我试图避免的延迟0.4秒。

我设法在AppController中做到这一点。 只需在创buildglView后立即放置此代码

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 plustesting)

  -(NSString*)getLaunchImageName { NSArray* images= @[@"LaunchImage.png", @"LaunchImage@2x.png", @"LaunchImage-700@2x.png", @"LaunchImage-568h@2x.png", @"LaunchImage-700-568h@2x.png", @"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", @"LaunchImage-800-667h@2x.png", @"LaunchImage-800-Portrait-736h@3x.png", @"LaunchImage-800-Landscape-736h@3x.png", ]; 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看起来与启animation面相同,则看不到淡入淡出。 问题是Cocos2D的初始视图是纯黑色的。

不幸的是,我发现解决这个问题的唯一方法是实际上添加一个与飞溅图像相同的UIImageView,然后在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 { 

现在它不再“消失”了。 注意意志,而不是 。 这个方法在iOS6和更高版本上是可用的,所以如果你希望你的应用和iOS5.x兼容,那么你可以对<__IPHONE_6_0进行预处理器版本检查,并使用“didFinishLaunching”方法,因为它不是甚至是一个问题。

如果这真的是你的代码,你可能在图像名称中有一个错字。 (如果没有,让我们知道什么是“不工作”的意思)。

此外,启animation面通常不会出现在每个应用程序的DidBecomeActive :. 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应用程序,并添加一些更多的细节。

如果您在6.1模拟器和7.x模拟器之间切换,行为确实很容易看出来 – 第一个模拟器会执行即时切换(出于同样的原因可能会出现黑色闪烁),而7.x模拟器执行缓慢烦人的黑色,随后在你的Cocos2D场景中闪烁。

如果你不想修改或inheritanceCCDirector的东西,你也可以使用相同的代码来修改你的AppDelegate。 在我们的例子中,这很简单:

  1. 在appDidFinishLaunching …我们等待,直到glView已经创build,然后将UIImage作为子视图添加到它;
  2. 然后,我们创build一个“postDidFinish …”例程,执行select器在0.1秒左右之后调用它。 在那,你可以使用他的相同的代码removeFromSubview。

它不像添加到CCDirector类那样优雅和隐蔽,但是很快就可以快速修复!

我怀疑这里还有更多的事情要做。 在应用程序周期开始时放置一些日志logging,因为在调用App Delegate方法时出现初始屏幕,请login并在必要时使用Instruments以查看启动时正在进行的操作。 还可以尝试在重新启动之前结束应用程序上的多任务处理,看看是否有所作为,并尝试一个新的空应用程序来查看体验是否相同。 你没有指出应用程序在启动时会做些什么,但是有没有你编码的animation可以在启动时影响淡入淡出?