Voglio mostrare un pannello di avvisi personalizzato sulla mia app, ma avere il precedente UIViewController visibile sullo sfondo. Speravo di mostrarlo come controller di visualizzazione modale. Come faccio a fare questo senza che il precedente UIViewController diventi nero e scompaia?Come sovrapporre un modalViewController a un'altra vista senza che l'originale scompaia?
risposta
Invece di mostrare il nuovo vc come vc modale, è necessario aggiungerlo come controller di vista del bambino:
AlertPanelVC *alertVC = ...
[self addChildViewController: alertVC];
alertVC.view.frame = ...; //or something equivalent if you're using auto layout
[self.view addSubview: alertVC.view];
[alertVC didMoveToParentViewController: self];
di respingerlo:
[alertVC willMoveToParentViewController:nil];
[alertVC.view removeFromSuperview];
[alertVC removeFromParentViewController];
Ecco quello che ho usato:
MyCustomAlertViewController *myCustomAlertViewController = [[MyCustomAlertViewController alloc]initWithNibName:@"MyCustomAlertViewController" bundle:nil];
myCustomAlertViewController.delegate = self; //optional if you have delegate setup
[myCustomAlertViewController setModalPresentationStyle:UIModalPresentationPageSheet];
[myCustomAlertViewController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self presentViewController:myCustomAlertViewController animated:YES completion:^{
//do stuff after the view is displayed.
}];
myCustomAlertViewController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
myCustomAlertViewController.view.superview.frame = CGRectMake(calculatedCenterX, CalculatedCenterY, myCustomAlertViewControllerWidth, myCustomAlertViewControllerHeight);
//calculatedCenterX = (1024 - myCustomAlertViewControllerWidth)/2; //for example
//calculatedCenterY = (768 - myCustomAlertViewControllerHeight)/2;
c'è un componente cool blurred per quello. certo, solo una questione di gusti. :)
Quando si presenta un controller di visualizzazione utilizzando lo stile UIModalPresentationFullScreen, UIKit normalmente rimuove le viste del controller di visualizzazione sottostante dopo la fine delle animazioni di transizione. È possibile impedire la rimozione di tali viste specificando invece lo stile UIModalPresentationOverFullScreen. È possibile utilizzare questo stile quando il controller della vista presentato dispone di aree trasparenti che consentono di mostrare il contenuto sottostante.
Quindi, in pratica un'istanza per il viewcontroller, specificare lo stile presenation modale e poi presentare il controller della vista.
Se si desidera avere uno sfondo (semi) trasparente, è sufficiente regolare il colore della vista principale del controller della vista.
Ottima risposta. Vorrei aggiungere due modifiche. (1) Invece di aggiungere e rimuovere la sottoview, è possibile animare. (2) Stai per voler bloccare l'interazione dell'utente con la parte esterna dello schermo visibile sullo sfondo. Per fare ciò, rendere la vista del nuovo controller di visualizzazione delle stesse dimensioni dello schermo, con uno sfondo chiaro in cui l'interazione dell'utente è disabilitata. L'utente non può vederlo (è chiaro) ma blocca i tocchi dal cadere attraverso. La tua nuova interfaccia è quindi una sottoview in cima a * that *. – matt
concordato. Personalmente mi piace usare una "vista di sfondo" nera con un valore alfa di 0,5-0,8. Questo crea l'effetto che lo sfondo si scurisce quando viene visualizzata la "sovrapposizione". Ma questa è solo una preferenza personale. :) – Tobi
Ho appena provato ad aggiungere 'nil' come fromViewController ... ha ottenuto un errore" 'I bambini visualizzano i controller (null) e devono avere un controller di visualizzazione padre comune quando chiamano - [UIViewController transitionFromViewController: ...' ", quindi non penso che funzionerà. –
denikov