martes, 21 de diciembre de 2010

Tag Archive for 'UISplitViewController' Your first iPad split view application

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:

//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];
Ahora vamos a acceder a la vista principal a través de un punto de vista Popover, cuando el IPAD está en modo retrato. El shouldAutorotateToInterfaceOrientation: el método de su maestro y el controlador debe ser compatible con detalle todas las orientaciones, de lo contrario no será posible girar una vista dividida. Una vez que implementan el protocolo UISplitViewControllerDelegate en cualquier clase y establecer el delegado del controlador de vista dividida. Los métodos dentro de este protocolo se llama cada vez que la vista principal se oculta o se muestra de nuevo.

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
 
}
Bueno, que hay que hacer algo más que esto si desea crear aplicaciones realmente útiles para dividir la vista. A menudo será conveniente usar una vista de tabla como su maestro. Algunas cosas me di cuenta, mientras que jugando con la vista División son los siguientes:

     * 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];
      }
}
Ahora, sólo tiene que utilizar su propia subclase UISplitViewController dentro de su código y la vista principal debe estar visible incluso en el modo de retrato. Espero que este código puede responder a sus preguntas y será útil para usted.

No hay comentarios:

Publicar un comentario

468x60