当应用程序进入后台时,有没有办法延迟 iOS 进行的屏幕截图?原因是当用户转到主屏幕时我有时会显示一个视图,我希望删除此视图,因此它不会在应用程序恢复时显示。有问题的视图是 我调用的 (此处SSHUDView
为源代码) 。这实际上在模拟器中有效,但在真实设备上无效(恢复时仍然显示)。任何人都知道如何处理这个问题?dismissAnimated:NO
applicationWillResignActive
SSHUDView
4 回答
我认为你应该在applicationDidEnterBackground:
.
根据苹果的文档:
- 准备为他们拍照。当该
applicationDidEnterBackground:
方法返回时,系统会为您的应用程序的用户界面拍照,并将生成的图像用于过渡动画。如果界面中的任何视图包含敏感信息,则应在applicationDidEnterBackground:
方法返回之前隐藏或修改这些视图。
如果您查看SSHUDView
实现,它使用UIWindow
实例来显示内容;它使自己的 UIWindow 成为关键UIWindow
:
[_hudWindow makeKeyAndVisible];
这可能就是为什么摆脱它如此棘手的原因。您可能会尝试SSHUDView
在它自行关闭以将焦点返回到主窗口后执行以下操作:
[[[[UIApplication sharedApplication] windows] objectAtIndex:0] makeKeyWindow];
当 hud 视图自行解除它发送resignKeyWindow
到它的私有_hudWindow
对象时,您可以尝试在将焦点返回到主窗口之前对其进行处理,如下所示:
[[[[UIApplication sharedApplication] windows] objectAtIndex:1] resignKeyWindow];
但它可能会导致意想不到的问题,因为你绕过了SSHUDView
API ......
你能不能让视图控制器显示 SSHUDView 来监听UIApplicationWillResignActiveNotification
并[NSNotificationCenter defaultCenter]
以这种方式隐藏它?看起来有点hacky,所以它可能不起作用。只是一个想法。
这对我有用,无论是模拟器还是真实硬件。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