2012-10-28 5 views

risposta

17

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]; 
+1

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

+0

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

+0

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

1

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; 
+0

Funziona solo su iPad. – Tobi

+0

Corretto, @Tobi - e l'interrogatore originale ha utilizzato il tag iPhone, non iPad. – matt

0

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.

From here

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.

Problemi correlati