在出现任何内容之前拦截applicationDidBecomeActive上的初始ViewController

时间:2015-12-28 16:40:44

标签: ios objective-c uiviewcontroller

我想在每次用户返回应用时立即显示自定义视图控制器。目前,我可以使用 didFinishLaunchingWithOptions 轻松完成此操作,只需选择初始rootViewController在屏幕上出现任何内容之前的内容。

但是,如果我将拦截VC放在applicationDidBecomeActive中,那么之前的VC在屏幕上停留半秒,然后才能加载拦截。

如何将应用程序放回到前台时,VC立即在屏幕上显示我的自定义拦截?然后,VC将自行恢复前景视图。

仅供参考:我使用此拦截来验证用户是否在受支持的位置,然后允许该应用返回状态或显示不受支持的屏幕。

2 个答案:

答案 0 :(得分:1)

这个问题有两种解决方法。

解决方案:1 您可以在应用程序的委托方法上编写interceptVC - 功能

func applicationWillEnterForeground(application: UIApplication)

而不是写在

func applicationDidBecomeActive(application: UIApplication)

<强>解决方案:2 正如您所做的那样,interceptVC - 在 applicationDidBecomeActive 上的功能也可以在应用程序进入后台时应用,

func applicationDidEnterBackground(application: UIApplication)

这样,可以涵盖 applicationDidBecomActive 延迟。

注意:此处应用程序一旦进入后台,将始终在后台使用interceptVC。

答案 1 :(得分:0)

OP解决方案。

我使用的解决方案是在应用程序重新启动时设置自定义背景图像。这也是多任务选择器中显示的屏幕。当应用程序恢复活动时,它是显示的初始屏幕,直到我的interceptVC加载。我使用的图像与我的interceptVC背景相同,所以它看起来是即时的。这比尝试在活动的辞职时预加载拦截VC更容易。一些淡入淡出动画也用在imageview上,使其更平滑,更刺耳。

- (void)applicationWillResignActive:(UIApplication *)application {
    // fill screen with our own imageView
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.window.frame];

    if(IS_IPHONE_6P){
        imageView.image = [UIImage imageNamed:@"splash_1242x2208.png"];
    } else if(IS_IPHONE_6){
        imageView.image = [UIImage imageNamed:@"splash_750x1334.png"];
    } else if(IS_IPHONE_5){
        imageView.image = [UIImage imageNamed:@"splash_640x1136.png"];
    } else if(IS_IPHONE_4_OR_LESS){
        imageView.image = [UIImage imageNamed:@"splash_640x960.png"];
    } else {
        // should not happen
        imageView.image = [UIImage imageNamed:@"splash_750x1334.png"];
    }    

    imageView.tag = 1234;
    imageView.alpha = 0;
    [self.window addSubview:imageView];
    [self.window bringSubviewToFront:imageView];

    // fade in the view
    [UIView animateWithDuration:0.5 animations:^{
        imageView.alpha = 1;
    }];
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // grab a reference to our imageView
    UIView *imageView = [self.window viewWithTag:1234];

    // fade away imageView view from main view
    [UIView animateWithDuration:0.5 animations:^{
        imageView.alpha = 0;
    } completion:^(BOOL finished) {
        // remove when finished fading
        [imageView removeFromSuperview];
    }];
}