Чтобы создать новый 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;
}
Ответы
Ответ 1
UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
window1.backgroundColor = [UIColor redColor];
window1.windowLevel = UIWindowLevelAlert;
[window1 makeKeyAndVisible];
Наконец, я знаю, почему это не работает, потому что window1 - это метод var, и он будет потерян после выполнения метода. Поэтому я объявляю для нее новый @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];
он работает!
Ответ 2
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)
Обратите внимание, что это окно должно обрабатывать изменения ориентации.
Ответ 3
Ваш объект window1
является локальной переменной, когда код заканчивается из этого метода, этот объект больше не существует. Любой объект UIWindow
, который мы создали, будет добавлен в [[UIApplication sharedApplication] windows]
, но этот массив сохраняет ссылку недели только на какой-либо объект UIWindow
, поэтому он до вашего собственного кода, чтобы сохранить объект окна., Я предполагаю, что объект [UIApplication sharedApplication]
существует, пока приложение запускается, делая это, чтобы избежать сохранения объектов UIWindow
, которые должны существовать на некоторое время, проживая в памяти "навсегда".
Что еще, ваш код может работать с MRC.
Ответ 4
попробуйте добавить UIView
в mainWindow не другой 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];
UIView * viewAlert = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
viewAlert.backgroundColor = [UIColor redColor];
[self.window.rootViewController.view addSubView:viewAlert];
/* or you can use following..
[self.window addSubView:viewAlert];
*/
[viewAlert release]; //FOR NON ARC
return YES;
}
Ответ 5
В быстрой можно добавить новый UIWindow
следующим образом.
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var viewController: ViewController?
var navigationController: UINavigationController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.viewController = ViewController(nibName: "ViewController", bundle:NSBundle.mainBundle())
self.navigationController = UINavigationController(rootViewController: self.viewController!)
self.window!.rootViewController = self.navigationController
// self.window!.addSubview(self.viewController!.view)
self.window!.makeKeyAndVisible()
return true
}
//Other methods..
}