5

アプリがバックグラウンドに入ったときにiOSによるスクリーンキャプチャを遅らせる方法はありますか?その理由は、ユーザーがホーム画面に移動したときにビューが表示されることがあるため、アプリを再開したときに表示されないように、このビューを削除したいのです。問題のビューは (ここSSHUDViewのソースコード)で、私は これを呼び出します。これは実際にはシミュレーターでは機能しますが、実際のデバイスでは機能しません(再開時に表示されます)。誰もがこれに対処する方法の手がかりを持っていますか?dismissAnimated:NOapplicationWillResignActiveSSHUDView

4

4 に答える 4

15

これはで処理する必要があると思いますapplicationDidEnterBackground:

Appleのドキュメントによると:

  • 写真を撮ってもらう準備をします。メソッドが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];

SSHUDViewただし、 APIをバイパスしているため、予期しない問題が発生する可能性があります...

于 2013-01-12T11:23:35.547 に答える
1

SSHUDViewを表示するViewControllerを取得して、その方法でリッスンしUIApplicationWillResignActiveNotification[NSNotificationCenter defaultCenter]非表示にすることはできますか?少しハッキーなようですので、うまくいかないかもしれません。ちょっとした考え。

于 2013-01-06T21:06:13.297 に答える
1

これは、シミュレーターと実際のハードウェアの両方で機能しました。では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
于 2013-01-11T21:29:53.633 に答える