La división de opiniones es algo muy fresco en el nuevo iPhone OS 3.2. Nos permite visualizar una vista maestra-detalle de una manera muy simple. Combinada con la pantalla iPads 'grande de 1024 × 748 píxeles, será posible crear incluso mejor, más aplicaciones fáciles de usar y valioso.
Básicamente, la vista dividida se compone de dos vistas separadas. La vista principal se muestra en la parte 320 píxeles de ancho en su pantalla si su IPAD está en posición horizontal, de lo contrario la vista principal será accesible como una vista Popover. La vista de detalles deben mostrar su contenido principal y estará a tamaño completo si su IPAD está en orientación vertical. Principalmente el usuario se centrará en su punto de vista los detalles y este hecho debe tener en cuenta.
Creación de una vista dividida pragmática dentro de la aplicación es una tarea fácil. El código siguiente muestra esto:
Básicamente, la vista dividida se compone de dos vistas separadas. La vista principal se muestra en la parte 320 píxeles de ancho en su pantalla si su IPAD está en posición horizontal, de lo contrario la vista principal será accesible como una vista Popover. La vista de detalles deben mostrar su contenido principal y estará a tamaño completo si su IPAD está en orientación vertical. Principalmente el usuario se centrará en su punto de vista los detalles y este hecho debe tener en cuenta.
Creación de una vista dividida pragmática dentro de la aplicación es una tarea fácil. El código siguiente muestra esto:
//create the master view MasterViewController *masterView = [[MasterViewController alloc] initWithNibName:@"Master" bundle:[NSBundle mainBundle]]; //create the details view DetailsViewController *detailsView = [[DetailsViewController alloc] initWithNibName:@"Details" bundle:[NSBundle mainBundle]]; //create the split view UISplitViewController *splitController = [[UISplitViewController alloc] init]; //set the view controllers array splitController.viewControllers = [NSArray arrayWithObjects:masterView, detailsView, nil]; //show split view as the main view [window addSubview:splitController.view]; [window makeKeyAndVisible]; //release view [masterView release]; [detailsView release];
En mi ejemplo he creado otra clase que obtiene una referencia al controlador de ver los detalles y tiene la barra de herramientas objetos vamos a utilizar para presentar el botón Popover. El siguiente código es bastante simple y contiene los tres métodos del protocolo UISplitViewControllerDelegate. El primer método se llama cada vez que la vista principal se ocultará. Así que en este caso vamos a añadir una barra de herramientas con el botón Popover dado a nuestro punto de vista los detalles. Usted es libre de la etiqueta del botón que desee. El segundo método se llama cada vez que la vista principal se muestra de nuevo. Ahora simplemente ocultar la barra de herramientas. Por lo tanto, eso es bastante todo. La lógica de la visualización de la vista principal dentro de una visión Popover se hace automáticamente, pero todavía se puede modificar en el último método (que está vacío en mi caso).
//the master view controller will be hidden - (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc { if(toolBar == nil) { //set title of master button barButtonItem.title = @"Show Master"; //create a toolbar toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 1024, 44)]; [toolBar setItems:[NSArray arrayWithObject:barButtonItem] animated:YES]; } //add the toolbar to the details view [detailController.view addSubview:toolBar]; } //the master view will be shown again - (void)splitViewController:(UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)button { //remove the toolbar [toolBar removeFromSuperview]; } // the master view controller will be displayed in a popover - (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController { //empty for now }
* No son capaces de presentar una vista dividida como un punto de vista modal
* Si la vista maestra o de detalle no permite que todas las orientaciones de la interfaz, la vista dividida no funcionará correctamente. Así que si usted no ve la vista Patrón revisar su método de shouldAutorotateToInterfaceOrientation dentro de su regulador de la visión.
Va a encontrar el código fuente de este ejemplo en mi github repositorio. El proyecto se llama MasterDetail.
Saludos,
Andreas
Actualización:
Algunas personas me preguntan si es posible mantener la vista Patrón visible incluso en el modo de retrato. He intentado todo y las observadas tras la solución de trabajo:
Crear una subclase de UISplitViewController y sólo willAnimateRotationToInterfaceOrientation sobrescribir el método: duración:. Este método será llamado cada vez que la orientación de un punto de vista va a ser cambiado. Todo lo que tienes que hacer es comprobar si la interfaz se convertirá en un método de retrato y si eso es verdad, ajustar el marco a vista de su maestro y las vistas de detalle. A continuación encontrará el código que utiliza para conseguir este trabajo:
/** * Sent to the view controller just before * the user interface begins rotating. */ - (void)willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { //get master and detail view controller UIViewController* master = [self.viewControllers objectAtIndex:0]; UIViewController* detail = [self.viewControllers objectAtIndex:1]; //only handle the interface orientation //of portrait mode if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { //adjust master view CGRect f = master.view.frame; f.size.width = 320; f.size.height = 1024; f.origin.x = 0; f.origin.y = 0; [master.view setFrame:f]; //adjust detail view f = detail.view.frame; f.size.width = 830; f.size.height = 1024; f.origin.x = 320; f.origin.y = 0; [detail.view setFrame:f]; } else { //call super method [super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration]; } }
No hay comentarios:
Publicar un comentario