アプリがバックグラウンドに入ったときにiOSによるスクリーンキャプチャを遅らせる方法はありますか?その理由は、ユーザーがホーム画面に移動したときにビューが表示されることがあるため、アプリを再開したときに表示されないように、このビューを削除したいのです。問題のビューは (ここSSHUDView
のソースコード)で、私は これを呼び出します。これは実際にはシミュレーターでは機能しますが、実際のデバイスでは機能しません(再開時に表示されます)。誰もがこれに対処する方法の手がかりを持っていますか?dismissAnimated:NO
applicationWillResignActive
SSHUDView
4 に答える
これはで処理する必要があると思いますapplicationDidEnterBackground:
。
Appleのドキュメントによると:
- 写真を撮ってもらう準備をします。メソッドが
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を表示するViewControllerを取得して、その方法でリッスンしUIApplicationWillResignActiveNotification
て[NSNotificationCenter defaultCenter]
非表示にすることはできますか?少しハッキーなようですので、うまくいかないかもしれません。ちょっとした考え。
これは、シミュレーターと実際のハードウェアの両方で機能しました。ではapplicationDidEnterBackground:
、背景が黒の一時的なView Controllerを作成し、それを「最上位」のView Controllerの上にモーダルで表示できます(すでにモーダルで表示されているView Controllerがある場合)。アプリが戻ってきたら削除するだけです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