延迟applicationDidEnterBackground屏幕截图

时间:2013-01-04 17:13:03

标签: objective-c ios cocoa-touch

当app进入后台时,有没有办法延迟iOS的屏幕截图?原因是我有时会在用户进入主屏幕时显示视图我希望删除此视图,以便在恢复应用时不显示。相关视图是SSHUDView(源代码here),我在dismissAnimated:NO中称之为applicationWillResignActive。这实际上在模拟器中有效,但在真实设备上却没有(SSHUDView在恢复时仍然显示)。任何人都知道如何处理这个?

4 个答案:

答案 0 :(得分:15)

我认为您应该在applicationDidEnterBackground:处理此问题。

根据Apple's documentation

  • 准备拍摄照片。applicationDidEnterBackground:方法返回时,系统会拍摄应用程序用户界面的图片,并将生成的图像用于过渡动画。如果界面中的任何视图包含敏感信息,则应在applicationDidEnterBackground:方法返回之前隐藏或修改这些视图。

答案 1 :(得分:2)

如果查看SSHUDView实现,它会使用UIWindow实例来显示内容;它使自己的UIWindow成为键UIWindow

[_hudWindow makeKeyAndVisible];

这可能是为什么摆脱这么棘手的原因。您可能会尝试执行SSHUDView解散自身以将焦点返回到主窗口后执行的操作:

[[[[UIApplication sharedApplication] windows] objectAtIndex:0] makeKeyWindow];

当hud视图自行解除它会向其私有resignKeyWindow对象发送_hudWindow时,您可能会尝试在将焦点返回到主窗口之前获取该句柄,如下所示:

[[[[UIApplication sharedApplication] windows] objectAtIndex:1] resignKeyWindow];

但是,由于您绕过SSHUDView API ...

,可能会导致意外问题

答案 2 :(得分:1)

您是否可以让显示SSHUDView的视图控制器从UIApplicationWillResignActiveNotification收听[NSNotificationCenter defaultCenter]并隐藏它?看起来有点hacky,所以它可能无法正常工作。只是一个想法。

答案 3 :(得分:1)

这适用于我,包括模拟器和真实硬件。在applicationDidEnterBackground:中,您可以创建一个带有黑色背景的临时视图控制器,并以模态方式在“最顶层”视图控制器上显示(如果已经有模态显示视图控制器)。当应用程序返回applicationWillEnterForeground:

时,只需将其删除即可
#import "AppDelegate.h"

@interface AppDelegate ()
@property (strong, nonatomic) UIViewController *veilController;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    self.window.rootViewController.view.backgroundColor = [UIColor redColor];
    [self.window makeKeyAndVisible];

    UIViewController *vc0 = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    vc0.view.backgroundColor = [UIColor blueColor];
    [self.window.rootViewController presentViewController:vc0 animated:NO completion:nil];

    UIViewController *vc1 = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    vc1.view.backgroundColor = [UIColor purpleColor];
    [vc0 presentViewController:vc1 animated:NO completion:nil];

    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    self.veilController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
    self.veilController.view.backgroundColor = [UIColor blackColor];

    UIViewController *tvc = self.window.rootViewController;
    while (tvc) {
        if (tvc.presentedViewController) {
            tvc = tvc.presentedViewController;
        } else {
            [tvc presentViewController:self.veilController animated:NO completion:nil];
            tvc = nil;
        }
    }
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [self.veilController dismissViewControllerAnimated:NO completion:nil];
    self.veilController = nil;
}

@end