Подтвердить что ты не робот

Чтобы создать новый 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;
}
4b9b3361

Ответ 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..
}