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