buttons ios iphone

buttons - menu ios



El detalle de la demostraciĆ³n adaptativa se transforma en modal en lugar de en iPhone cuando el controlador de vista maestra es un UITabBarController (3)

En XCode 6, si creas un nuevo proyecto basado en la plantilla de aplicación de detalles maestros, obtendrás un guión gráfico universal que se supone es bueno para todos los dispositivos.

Al seleccionar una celda en la vista maestra, la vista de detalles se actualiza a través de un segmento adaptativo "mostrar detalles". En un iPhone 4, 5, 6 o 6+ en vertical, este segmento tomará la forma de un empuje como se espera. En un iPad o un iPhone 6+ en modo horizontal, la vista detallada se actualizará como se esperaba.

Ahora, si inserta un UITabBarController como el controlador de vista maestra que tiene una pestaña para el controlador de vista maestro original, el segmento adaptativo que se produce al seleccionar una celda en la vista maestra no se comporta como se espera en los iPhones. En lugar de obtener una transición de empuje, ahora obtienes una transición modal. ¿Cómo puedo arreglar eso? Parece extraño que esto no sea compatible de forma predeterminada.

Me pareció útil la siguiente publicación: iOS8 TabbarController dentro de un UISplitviewController Master Pero cuando utilizo el método sugerido, no obtengo el comportamiento correcto en un iPhone 6 Plus cuando lo giro al paisaje después de un empuje vertical. El contenido de la vista detallada aparece en la vista maestra, lo que no es sorprendente, ya que eso es lo que hace la solución sugerida.

¡Gracias!


Desafortunadamente, la respuesta seleccionada no funcionó para mí. Sin embargo, finalmente logré resolver el problema:

  1. Subclase UISplitViewController y establece la nueva clase en Interface Builder.
  2. Haga que la nueva clase se ajuste a UISplitViewControllerDelegate :

    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.delegate = self }

  3. Implementar estos dos métodos:

    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool { return true } func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool { if splitViewController.isCollapsed { guard let tabBarController = splitViewController.viewControllers.first as? UITabBarController else { return false } guard let selectedNavigationViewController = tabBarController.selectedViewController as? UINavigationController else { return false } // Push view controller var detailViewController = vc if let navController = vc as? UINavigationController, let topViewController = navController.topViewController { detailViewController = topViewController } selectedNavigationViewController.pushViewController(detailViewController, animated: true) return true } return false }


El estado de los documentos cuando el controlador dividido está contraído, maneja showDetail llamando a show en el controlador de vista maestra, que en su caso es un controlador de pestañas. Debe reenviarlo al controlador de navegación infantil de la siguiente manera:

  1. Hacer una subclase de controlador de pestañas.
  2. En el guión gráfico, configure el controlador de pestañas para utilizar la nueva subclase.
  3. Agregue este método a la subclase:

-

- (void)showViewController:(UIViewController *)vc sender:(id)sender{ [self.viewControllers.firstObject showViewController:vc sender:sender]; }

Esto lo reenvía al controlador de navegación en la primera pestaña.


Revisando videos de WWDC14 Creo que he encontrado una mejor respuesta.

  1. Utilice un UISplitViewController personalizado (subclase)
  2. Anular la operación showDetailViewController
  3. Utilice traitCollection para determinar la clase de UISplitViewController
  4. Si la clase horizontal es compacta, obtenga el navigationController para llamar a showViewController

Aquí está el código del UISplitViewController personalizado:

import UIKit class CustomSplitViewController: UISplitViewController { override func showDetailViewController(vc: UIViewController!, sender: AnyObject!) { if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact) { if let tabBarController = self.viewControllers[0] as? UITabBarController { if let navigationController = tabBarController.selectedViewController as? UINavigationController { navigationController.showViewController(vc, sender: sender) return } } } super.showDetailViewController(vc, sender: sender) } }

No te olvides del conjunto de la clase personalizada en el guión gráfico.

Probado en el simulador de iPhone 6, iPhone 6+ y iPad Air y funcionó como se esperaba.