Scenario:
Ho creato una finestra overlay (con tag = 100) che alla fine voglio eliminare, ma il seguente codice non funziona:
UIApplication.shared.windows.first?.becomeKey()
UIApplication.shared.windows.last?.resignKey()
(lldb) po UIApplication.shared.windows
▿ 2 elements
- 0 : <UIWindow: 0x7fa698d0ad00; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x600000048550>; layer = <UIWindowLayer: 0x6000000278a0>>
- 1 : <UIWindow: 0x7fa698d14bb0; frame = (0 0; 768 1024); autoresize = W+H; tag = 100; gestureRecognizers = <NSArray: 0x600000252a50>; layer = <UIWindowLayer: 0x600000229660>>
Qualche idea per alternare o eliminare la finestra di sovrapposizione?
risposte:
0 per risposta № 1Basta impostare la finestra "s isHidden
proprietà su true:
var overlayWindow: UIWindow?
...
overlayWindow?.isHidden = true
overlayWindow = nil // optional
Se si imposta qualsiasi riferimento a questa finestra su zero, la finestra verrà eliminata.
Si prega di notare che non si dovrebbe chiamare resignKey()
. A partire dal la sua documentazione (sottolineatura mia):
Discussione
Non chiamare mai questo metodo direttamente. Il sistema lo chiama metodo e postUIWindowDidResignKey per consentire alla finestra di sapere quando non è più la chiave. L'implementazione predefinita di questo metodo lo fa nulla, ma le sottoclassi possono ignorarlo e utilizzarlo per eseguire attività relativo alla rinuncia allo stato della finestra chiave.
Lo stesso vale per becomeKey()
, a proposito. Probabilmente vuoi usare makeKey () o makeKeyAndVisible ().
0 per risposta № 2
Questa è essenzialmente una domanda in due parti.
- Come posso visualizzare una UIWindow creata e
- Come posso respingerlo?
Ho imparato che devo mantenere un riferimento alla UIWindow appena creata piuttosto che semplicemente avere locale-scope riferimento. ... che è ovvio.
Una volta che ho un riferimento persistente alla UIWindow ancillary, posso semplicemente assegnargli zero per rimuoverlo:
var hamburgerWindow:UIWindow?
@IBAction func displayOverlayWindowAction() {
guard hamburgerWindow != nil else {
displayOverLay()
return
}
hamburgerWindow = nil
}