ios - ver - ventana flotante netflix
Para crear una nueva ventana UI en la ventana principal (6)
En mi aplicación, quiero crear una nueva UIWindow
en la ventana principal UI, y escribí lo siguiente, pero no funciona. Primero, creo una UIWindow
en la ventana principal y luego la hago clave y visible, y luego creo una nueva superposición UIWindow
, pero no sucede nada.
- (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;
}
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
}
}
}
De acuerdo con la documentación , para recibir eventos que no tienen un valor de coordenadas relevante, como la entrada del teclado, ¡haga que sea key
lugar de simplemente !
isHidden
:
coveringWindow.makeKeyAndVisible()
Incluso puede controlar la transparencia de su fondo, para un efecto de humo:
coveringWindow.backgroundColor = UIColor(white: 0, alpha: 0.5)
Tenga en cuenta que dicha ventana necesita manejar los cambios de orientación.
En swift se puede agregar una nueva UIWindow
como sigue ...
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..
}
Su objeto window1
es una variable local, cuando el código se queda sin este método, este objeto ya no existe. Cualquier objeto UIWindow
que creamos se agregará a las [[UIApplication sharedApplication] windows]
, pero esta matriz solo mantiene una semana de referencia a cualquier objeto UIWindow
, por lo que depende de su propio código para mantener el objeto de la ventana. Supongo que el objeto [UIApplication sharedApplication]
existe mientras se ejecute la aplicación, para evitar mantener los objetos UIWindow
que solo deben existir durante un tiempo y vivir en la memoria "para siempre".
Además, tu código podría funcionar con MRC.
intente agregar una UIView
en mainWindow no otra UIWindow
como ...
- (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;
}
Swift 4
Para evitar la pérdida de memoria, prefiero inicializar mi ventana personalizada de esta manera, según lo propuesto por Apple:
Si desea proporcionar una ventana personalizada para su aplicación, debe implementar el método de obtención de esta propiedad y usarla para crear y devolver su ventana personalizada.
Ejemplo:
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.window?.rootViewController = mainController
self.window?.makeKeyAndVisible()
}
UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
window1.backgroundColor = [UIColor redColor];
window1.windowLevel = UIWindowLevelAlert;
[window1 makeKeyAndVisible];
Finalmente, sé por qué no funciona, porque window1 es un método var y se perderá después de que se ejecute el método. Así que declaro una nueva propiedad para ella, como
@property (strong, nonatomic) UIWindow *window2;
y cambiar el código como
UIWindow *window2 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 80, 320, 320)];
window2.backgroundColor = [UIColor redColor];
window2.windowLevel = UIWindowLevelAlert;
self.window2 = window2;
[window2 makeKeyAndVisible];
¡funciona!