iOS应用程序显示最后显示的视图而不是闪屏 - 但有时仅显示

时间:2012-03-04 05:07:27

标签: objective-c ios splash-screen

有时候当我打开我的应用程序时(或者在它休眠一段时间之后恢复它或者在它'quit'之后打开它时),启动画面,基本上只是说'加载',不会显示。该应用程序显示应用程序退出之前最后显示的视图而不是加载屏幕。这很糟糕,因为它看起来应用程序已经加载,但它似乎没有响应,即使它只是加载。以前有没有人经历过这样的事情?

编辑:我熟悉暂停拍照的iOS行为并将其用作简历图片。然而,当应用程序已退出(按下主页按钮,然后点击主页按钮两次,点击并按住应用程序图标,然后点击红色短划线并退出)并重新启动,它不会使用启动屏幕在下次启动时仍然使用最后显示的视图。我可以强制该应用始终使用启动画面吗?

5 个答案:

答案 0 :(得分:4)

问题的原因是我在applicationWillTerminate:上执行了长时间操作,这延迟了应用程序的“真正”终止(我假设)。因此,当我在关闭它之后立即重新打开应用程序时,此操作(将数据写入磁盘)仍在继续,因此该应用程序尚未真正退出。我认为这是我可以推断的问题。

答案 1 :(得分:3)

您确定该应用确实正在推出而不仅仅是暂停?您的描述的行为与已暂停并写入二级存储的应用程序的行为完全相同。

答案 2 :(得分:1)

是的,这是按预期工作的。每次你的应用程序进入暂停状态时,iOS都会截取屏幕截图并在下次发布时将其用作启动图像,除非它是一个新的发布。所以“或者在'quit'之后打开它”似乎不对。如果确实发生这种情况,则表示您认为自己的应用退出。

无论如何,如果app从头开始或从后台启动都没关系,你应该总是尽快显示你的视图,给用户一些加载的通知,然后异步处理加载内容,没有用户等待反应迟钝的应用程序希望它能在不久的将来工作。

答案 3 :(得分:0)

像Caleb所说,你的申请正在被暂停,但并没有真正退出。要强制您的应用在暂停后退出,请在您的ProductName-Info.plist中将UIApplicationExitsOnSuspend设置为YES

答案 4 :(得分:0)

当应用程序进入后台时,设备操作系统创建快照屏幕图像,这里是您可以在应用程序“AppData / Library / Caches / Snapshots /”的沙箱中找到的路径。

这是一个技巧,您可以阻止在启动应用程序时显示应用程序的最后一个屏幕。

   // Create subclass of UIImageView



      @interface SnapShotImageView :UIImageView


        @end

        @implementation SnapShotImageView :UIImageView


        @end

    //  Create function in appdelegate.m

      - (void)createSnapshotWhileApplicationGoesInBackground{

        NSString *splashImg = nil;
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
            splashImg= @"Default~ipad.png";
        }
        else {
            splashImg= @"Default~iphone.png";
        }
        UIWindow *win = [[UIApplication sharedApplication] keyWindow];
        SnapShotImageView *splash = [[SnapShotImageView alloc] initWithImage:[UIImage imageNamed:splashImg]];
        splash.frame = self.window.bounds;
        [win addSubview:splash];
    }


    - (void)removeSnapshotFromWindow{
        UIWindow *win = [[UIApplication sharedApplication] keyWindow];
        if ([[win subviews] count] > 1) {
            [NSThread sleepForTimeInterval:0.5];

            NSArray *array = [win subviews];

            [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

                if ([obj isKindOfClass:[SnapShotImageView class]]) {
                     [obj removeFromSuperview];
                }
            }];
        }
    }


 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
       [self removeSnapshotFromWindow];
}

//Call this function Application delegate method this way..
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self createSnapshotWhileApplicationGoesInBackground];
}

- (void)applicationWillEnterForeground:(UIApplication *)application{
    [self removeSnapshotFromWindow];
}

- (void)applicationDidBecomeActive:(UIApplication *)application{
    [self removeSnapshotFromWindow];
}

这里我们创建启动画面的快照..只需在窗口中添加启动画面。当应用程序进入后台时

并在应用程序进入前台时删除快照