在 iOS 7 上,启动图像会在应用加载时淡出而不是立即消失。
是否有任何设置可以防止此启动图像淡出动画?我需要它立即消失,就像在 iOS 6 及更早版本中一样。
编辑答案:
是的,可以将启动图像作为 UIImageView 添加到顶部窗口,并在启动淡入淡出动画完成后将其隐藏。但这会导致我试图避免的 0.4 秒延迟。
在 iOS 7 上,启动图像会在应用加载时淡出而不是立即消失。
是否有任何设置可以防止此启动图像淡出动画?我需要它立即消失,就像在 iOS 6 及更早版本中一样。
编辑答案:
是的,可以将启动图像作为 UIImageView 添加到顶部窗口,并在启动淡入淡出动画完成后将其隐藏。但这会导致我试图避免的 0.4 秒延迟。
我已经设法在 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",
@"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 看起来与初始屏幕相同,则您看不到淡入淡出。问题是 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 {
现在它不再“褪色”了。注意will而不是did。但是,此方法在 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;
}
我只是想确认 Patrick 的回答,因为它与 Cocos2D 应用程序有关,并添加了更多细节。
如果您在 6.1 模拟器和 7.x 模拟器之间切换,这种行为确实很容易看到——第一个是即时切换(出于同样的原因,可能会闪烁黑色),而 7.x 模拟器的切换速度很慢和烦人的淡入黑色,然后是你的 Cocos2D 场景的闪烁。
如果您不想修改或继承 CCDirector 的东西,您也可以使用他的相同代码来修改您的 AppDelegate。在我们的例子中,很简单:
它不像添加到 CCDirector 类那样优雅和不可见,但它很容易快速修复!
从 iOS 12 开始,仍然无法禁用闪屏淡出动画。
我怀疑这里还有更多事情要做。在应用程序周期开始时放置一些日志记录语句,因为在调用 App Delegate 方法时会出现启动屏幕,因此请在此处登录并在必要时使用 Instruments 以查看启动时发生的情况。还可以尝试在重新启动之前结束应用程序上的多任务,看看是否有区别,还可以尝试一个新的空应用程序,看看体验是否相同。您还没有说明应用程序在启动时会做什么,但是您是否编写了任何动画来影响启动时的淡入或淡出?