当应用程序返回前台时控制应用程序快照

时间:2014-09-23 07:18:50

标签: ios objective-c uiviewcontroller passwords presentviewcontroller

我要实现一个特定的ViewController - 每当我的应用程序进入前台时弹出窗口, - 需要访问密码。

由于应用程序已经成熟并且有点复杂,我宁愿将此密码屏幕作为单独的ViewController处理,该ViewController出现在其他VC之上,通过appDidBecomeActive等方法从AppDelegate调用:

    if (self.pwdVc==nil)
        self.pwdVc = [mainStoryboard instantiateViewControllerWithIdentifier:@"passwordScreen"];
    [self.window.rootViewController presentViewController:self.pwdVc animated:NO completion:nil];

这种方法的问题似乎是:当应用程序进入前台时,密码ViewController尚未在屏幕上绘制,并且在短时间内显示真实的应用程序屏幕。

即使我提前在applicationDidEnterBackground中触发显示密码ViewController,当应用程序回到前台时,实际的屏幕重绘仍会发生,从而显示应用程序屏幕。

任何人都可以建议最合适的方法让这个密码屏幕隐藏隐藏的ViewControllers吗?

alpha设置从0.0切换到1.0的方法似乎还需要一些时间才能显示,到目前为止还没有工作。

谢谢!

3 个答案:

答案 0 :(得分:1)

使用此方法在最重要的基础上呈现viewController。

+ (void)presentViewController:(UIViewController *)viewController animated:(BOOL)animated complete:(void (^)(void))callback
{
    UIViewController *activeModalVC = [[[[UIApplication sharedApplication] delegate] window].rootViewController presentedViewController];
    if (activeModalVC) {
        [activeModalVC presentViewController:viewController animated:animated completion:callback];
    } else {
        [[[[UIApplication sharedApplication] delegate] window].rootViewController presentViewController:viewController animated:animated completion:callback];
    }
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Making passwordView to load
    self.pwdVc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil]
                  instantiateViewControllerWithIdentifier:@"passwordScreen"];
    [self.pwdVc view];
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [AFAppDelegate presentViewController:self.pwdVc animated:NO complete:nil];
}

答案 1 :(得分:0)

我从2013年开始就此主题找到another thread,说明可以在拍摄屏幕快照之前执行从applicationDidEnterBackground中删除当前视图中的相关数据的说明。

实际上它对我不起作用:在执行applicationDidEnterBackground甚至applicationWillResignActive之前,屏幕内容会返回用于返回foregroung的快照。

答案 2 :(得分:0)

解决方案来自this topic,它基于在任何其他视图之上放置一个不透明的“屏幕锁定”视图,并通过正确的hidden中的AppDelegate属性对其进行控制方法!

所以:

  1. 在Interface Builder中的任何其他视图的顶部添加视图,并最初在view.hidden=NO中设置其didFinishLaunchingWithOptions;
  2. 确保在view.hidden=NO中设置applicationWillResignActive,因为在将应用程序发送到后台以及调用多任务处理屏幕时都会发生此调用;
  3. 在“屏幕锁定”视图中放置一个按钮,调用密码正确时设置view.hidden=YES的方法。
  4. (可选)使用layer.zPosition调整可见视图的顺序。

    Etvoilà!谢谢大家!