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