web-dev-qa-db-ja.com

メインウィンドウ上に新しいUIWindowを作成するには

私のアプリでは、メインのUIWindow上に新しいUIWindowを作成したいのですが、次のように書きましたが、機能しません。最初に、メインウィンドウとしてUIWindowを作成し、それをキーにして表示し、次に新しいUIWindowオーバーレイを作成しますが、何も起こりません。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor redColor];
    ViewController *vc = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];
    UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
    window1.backgroundColor = [UIColor redColor];
    window1.windowLevel = UIWindowLevelAlert;
    [window1 makeKeyAndVisible];
    return YES;
}
32
bohan
UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
window1.backgroundColor = [UIColor redColor];
window1.windowLevel = UIWindowLevelAlert;
[window1 makeKeyAndVisible];

最後に、window1はメソッド変数であり、メソッドの実行後に失われるため、なぜ機能しないのかがわかります。そのため、新しい@propertyを宣言します。

@property (strong, nonatomic) UIWindow *window2;

そして、コードを次のように変更します

UIWindow *window2 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 80, 320, 320)];
window2.backgroundColor = [UIColor redColor];
window2.windowLevel = UIWindowLevelAlert;
self.window2 = window2;
[window2 makeKeyAndVisible];

できます!

58
bohan

Xcode 8 + Swift

class ViewController: UIViewController {
    var coveringWindow: UIWindow?

    func coverEverything() {
        coveringWindow = UIWindow(frame: (view.window?.frame)!)

        if let coveringWindow = coveringWindow {
            coveringWindow.windowLevel = UIWindowLevelAlert + 1
            coveringWindow.isHidden = false
        }
    }
}

ドキュメント によると、キーボード入力などの関連する座標値を持たないイベントを受信するには、単に!keyではなくisHiddenにします。

coveringWindow.makeKeyAndVisible()

煙の効果のために、背景の透明度を制御することもできます。

coveringWindow.backgroundColor = UIColor(white: 0, alpha: 0.5)

そのようなウィンドウは方向の変更を処理する必要があることに注意してください。

11
SwiftArchitect

window1オブジェクトはローカル変数です。コードがこのメソッドを実行すると、このオブジェクトはもう存在しません。作成したUIWindowオブジェクトは[[UIApplication sharedApplication] windows]に追加されますが、この配列はUIWindowオブジェクトへの週参照のみを保持するため、ウィンドウオブジェクトを維持するのは独自のコードですなぜAppleこのように達成されたのか、アプリが実行されている限り[UIApplication sharedApplication]オブジェクトが存在し、そうするだけで必要なUIWindowオブジェクトを保持しないようにする記憶に「永遠に」生きるしばらく存在する。

さらに、コードはMRCで実行できます。

8
YuLong Xiao

Swift 4

メモリリークを避けるため、Appleで提案されているように、この方法でカスタムウィンドウを初期化することを好みます。

アプリにカスタムウィンドウを提供する場合は、このプロパティのgetterメソッドを実装し、それを使用してカスタムウィンドウを作成して返す必要があります。

例:

var myCustomWindow: UIWindow? = CustomWindow(frame: UIScreen.main.bounds)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let mainController: MainViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! MainViewController
    self.myCustomWindow?.rootViewController = mainController
    self.myCustomWindow?.makeKeyAndVisible()
}
2
user6618855