ipad - UISplitViewController: ¿Cómo fuerza mostrar master popover en el lanzamiento de la aplicación?(retrato)
ios5 portrait (8)
Extendiendo la respuesta de Rob, esto funciona bien para mí (en viewDidLoad de la pantalla de detalles):
//If in portrait mode, display the master view
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
[self.navigationItem.leftBarButtonItem.target performSelector:self.navigationItem.leftBarButtonItem.action withObject:self.navigationItem];
}
No es necesario buscar una referencia por separado, utilizando self.navigationItem.leftBarButtonItem en su lugar
En una aplicación para iPad, estoy usando UISplitViewController. Necesito obligar a mostrar el maestro popover cuando la aplicación se inicia en modo retrato.
Ahora estoy usando este código y funciona bien en iOS 5.0.
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
if ([[[AppDelegate sharedAppDelegate] splitViewController] respondsToSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]]) {
[[[AppDelegate sharedAppDelegate] splitViewController] performSelector:[[[AppDelegate sharedAppDelegate] btnMenu] action]];
}
}
Pero en iOS 5.1 (con el nuevo tipo de master popover) el comportamiento parece ser aleatorio. A veces, el popover se muestra en pantalla completa y a veces funciona bien.
Alguna sugerencia para 5.1?
He luchado con esto por un tiempo, y aún ahora no estoy 100% satisfecho con la solución, pero es lo único que he podido encontrar, dadas las limitaciones actuales.
Primero, anule el siguiente método delegado:
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
y úsalo para obtener una referencia al elemento del botón de la barra y almacenarlo en un iVar:
barButtonForMaster = barButtonItem;
Luego, cuando quiera mostrar el controlador de vista maestro, haga una llamada como esta:
[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster];
En caso de que desee realizar esto desde el principio, utilice un poco de retraso para evitar que se bloquee la aplicación (gracias al útil comentario):
[barButtonForMaster.target performSelector: barButtonForMaster.action withObject: barButtonForMaster afterDelay:1];
En ese caso, puede realizar el selector a la derecha en el método delegado de vista dividida.
No es necesario mantener referencias tontas al barButtonItem. Simplemente llame al mismo objetivo / acción. Ver mi respuesta https://.com/a/25695923/1021430
El objetivo es el controlador de vista dividida, y la acción es toggleMasterVisible:
No hay sugerencia aquí para 5.1, pero uno para 8.0:
Ahora con iOS8, hay UISplitViewController
métodos nuevos para la configuración de UISplitViewController
.
En su caso, juste establece el valor correcto en preferredDisplayMode
, por ejemplo en masterViewController viewDidLoad
.
C objetivo:
- (void)viewDidLoad {
// configuring splitviewcontroller
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
//....
}
Rápido:
override func viewDidLoad() {
self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
}
Pero es por supuesto iOS8 solamente.
Para iOS8 la forma más fácil es con lo siguiente:
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryOverlay;
Lo uso cuando la aplicación se inicia por primera vez para mostrar el inicio de sesión en masterViewController. En todos los demás casos que uso
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic
Si lo necesita al iniciar la aplicación, anule este método en su controlador de vista detallada:
-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return NO;
}
Sin embargo, si luego lo necesita para ocultarlo posteriormente, parece que no se ha llamado al método, por lo que deberá ocultarlo manualmente.
Una variación ligeramente menos hacky (rápida):
let btn = self.splitViewController!.displayModeButtonItem()
btn.target?.performSelector(btn.action, withObject: btn)
Yo uso esta solución:
En splitViewController en viewDidLoad establece displayMode en .primaryOverlay
override func viewDidLoad() {
if self.isCollapsed == false, self.displayMode == .primaryHidden {
self.preferredDisplayMode = .primaryOverlay
}
}
Y en vista de que WillAppear lo establezca nuevamente en .automatic
override func viewWillAppear(_ animated: Bool) {
self.preferredDisplayMode = .automatic
}
De esta forma, la vista maestra se mostrará en el lanzamiento de UISplitViewController y tendrá un comportamiento predeterminado después de que la orientación cambie.