0

我将实现一个特定ViewController的 - 每次我的应用程序进入前台时都会弹出 - 需要访问密码。

由于该应用程序已经成熟且有点复杂,我宁愿将此密码屏幕作为一个单独的 ViewController 处理,它出现在其他 VC 之上,通过诸如 applicationDidBecomeActive 之类的方法从 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 的方法似乎也需要一些时间才能显示出来,并且到目前为止还没有工作。

谢谢!

4

3 回答 3

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];
}
于 2014-09-23T07:20:27.807 回答
0

解决方案来自这个主题,并且基于将不透明的“屏幕锁定”视图放在任何其他视图之上,并通过其hidden属性以适当的AppDelegate方法控制它!

所以:

  1. 在 Interface Builder 中的任何其他视图之上添加一个视图,并最初将其设置view.hidden=NOdidFinishLaunchingWithOptions;
  2. 确保设置view.hidden=NOapplicationWillResignActive,因为在将应用程序发送到后台和调用多任务屏幕时都会发生此调用;
  3. 在“屏幕锁定”视图中放置一个按钮,调用设置view.hidden=YES密码正确时的方法。

可选地layer.zPosition用于调整可见视图的顺序。

瞧!谢谢你们!

于 2014-09-23T18:12:30.280 回答
0

从 2013 年开始,我发现了关于这个主题的另一个线程applicationDidEnterBackground,说可以在拍摄屏幕快照之前执行指令以从当前视图中删除相关数据。

实际上它对我不起作用:返回前景的快照是在执行applicationDidEnterBackground或什至之前使用屏幕内容拍摄的applicationWillResignActive

于 2014-09-23T16:04:23.090 回答