5

当应用程序进入后台时,有没有办法延迟 iOS 进行的屏幕截图?原因是当用户转到主屏幕时我有时会显示一个视图,我希望删除此视图,因此它不会在应用程序恢复时显示。有问题的视图是 我调用的 (此处SSHUDView为源代码) 。这实际上在模拟器中有效,但在真实设备上无效(恢复时仍然显示)。任何人都知道如何处理这个问题?dismissAnimated:NOapplicationWillResignActiveSSHUDView

4

4 回答 4

15

我认为你应该在applicationDidEnterBackground:.

根据苹果的文档

  • 准备为他们拍照。当该applicationDidEnterBackground:方法返回时,系统会为您的应用程序的用户界面拍照,并将生成的图像用于过渡动画。如果界面中的任何视图包含敏感信息,则应在applicationDidEnterBackground:方法返回之前隐藏或修改这些视图。
于 2013-01-06T21:25:16.570 回答
2

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

[_hudWindow makeKeyAndVisible];

这可能就是为什么摆脱它如此棘手的原因。您可能会尝试SSHUDView在它自行关闭以将焦点返回到主窗口后执行以下操作:

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

当 hud 视图自行解除它发送resignKeyWindow到它的私有_hudWindow对象时,您可以尝试在将焦点返回到主窗口之前对其进行处理,如下所示:

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

但它可能会导致意想不到的问题,因为你绕过了SSHUDViewAPI ......

于 2013-01-12T11:23:35.547 回答
1

你能不能让视图控制器显示 SSHUDView 来监听UIApplicationWillResignActiveNotification[NSNotificationCenter defaultCenter]以这种方式隐藏它?看起来有点hacky,所以它可能不起作用。只是一个想法。

于 2013-01-06T21:06:13.297 回答
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
于 2013-01-11T21:29:53.633 回答