2009-05-22 17 views
6

Estoy tratando de obtener un UISegmentedControl en un grupo UITableViewCell como en la configuración de wifi en la aplicación de configuración. El problema que estoy teniendo es que tengo un doble borde. Obtengo un borde para el UISegmentedControl y otro para el UITableViewCell.UITableViewCell/UISegmentedControl límite de problema

Supongo que necesito quitar el borde del UITableViewCell. ¿Cómo puedo hacer eso?

+2

Una sugerencia estilo de menor importancia: el uso de la capitalización adecuada de la los nombres de clase en el título de la pregunta lo harían mucho más fácil de leer. Puedes cambiarlo después del hecho. Lo siento, no tengo una respuesta, solo hago aplicaciones de escritorio en este momento. –

Respuesta

7

Me acabo de dar cuenta de que esto todavía está recibiendo respuestas. Da la casualidad que tuve que hacer esto para otro proyecto y desde que hice esta pregunta aprendí mucho más sobre el desarrollo de iPhone. Así es como lo resolví recientemente. Se trata de hacer que el marco tenga el tamaño correcto. Esto debería hacerlo para una tabla estándar.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; 
if(cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"] autorelease]; 

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(-1.0f, -1.0f, 302.0f, 46.0f)]; 
[cell.contentView addSubview:segmentedControl]; 
+1

@ daniel-wood: Los números que dio son correctos para el modo vertical, pero no funcionarán en el paisaje. Votando por eso :) –

+0

Ah, cierto. Supongo que podrías hacer tableView.frame.size.width - 18.0f para el ancho. Todos los demás valores deben ser iguales. –

1

Tengo un poco más de esto. Hasta ahora he subclasificado UITableViewCell. Creé una punta con UISegmentedControl en ella y puse el fondo de imagen de UITableViewCell en 0. Todavía no se ve del todo bien, pero es mejor que antes.

0

El truco parece ser el tamaño del UISegmentedControl al tamaño del backgroundView del control, no el contentView. Yo era capaz de hacerlo mediante programación mediante el procedimiento siguiente:

// Size to cover the entire background 
    self.contentView.frame = self.backgroundView.frame; 
    self.myControl.frame = self.contentView.bounds; 

Tenga en cuenta que si está utilizando un accesorio, es necesario tener en cuenta el accessoryView también.

La razón es que la jerarquía de la vista es el siguiente:

  • self (el UITableViewCell o subclase)
    • backgroundView
    • contentView
      • (sus controles en este espacio)
    • accessoryView

En la disposición vertical, el backgroundView 'marco s es {{9, 0}, {302, 44}}, mientras que el contentView' marco s es ligeramente más pequeño, en {{10, 1}, {300, 42}}. Esto le da a la celda su "borde" 1px cuando el estilo de la tabla está agrupado. Debe cambiar el tamaño del control contentViewy para obtener el tamaño adecuado.

(NOTA:. Mientras que Apple realmente tiene varios ejemplos de un UISegmentedControl en el proyecto de código UICatalog muestra en the SDK, que efectivamente "trampa" mediante el uso de un UIViewController y el establecimiento de la vista principal color de fondo al color de fondo de la tabla)

+0

El código de muestra de control segmentado al que hace referencia usa una vista genérica, no una vista de tabla, para mostrar sus controles; parece una vista de tabla agrupada solo porque usa ese color de fondo. –

+0

Excavó y encontró la respuesta correcta. Mantuve una referencia a mi respuesta anterior, por lo que otros saben que el ejemplo de Apple en realidad no lo hace. –

3

En el caso de la configuración de Wi-Fi, sospecho que lo que han hecho es que el botón "Olvidar esta red", la etiqueta "Dirección IP" y el control segmentado "DHCP/BootP/estático" forman parte de la vista de encabezado de la tabla. Si necesita hacer esto en el medio de la tabla (en lugar de en la parte superior o inferior, para las cuales usaría las propiedades tableHeaderView y tableFooterView respectivamente), le sugiero que utilice los métodos delegados -tableView:viewForHeaderInSection: con -tableView:heightForHeaderInSection, o correspondientes Footer variantes. Con cualquiera de ellos, configuraría una vista personalizada para esa "sección" de su vista de tabla (utilizando un color de fondo claro o [UIColor groupTableBackgroundColor]), que contiene una etiqueta y un control segmentado dispuestos de modo que coincidan con el resto de las secciones de la mesa.

2

Utilizando la técnica de this post para eliminar la opacidad del fondo del UITableViewCell trabajaron con mayor facilidad para que consiga sólo el UISegmentedControl para mostrar en la fila de tabla.

+0

Esta es la forma correcta de hacerlo: haga que el marco del control sea el mismo que el 'cell.contentView.bounds', establezca' autoresizingMask' en 'UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight', agregue el control como una subvista de 'cell.contentView' y establezca' cell.backgroundView' en un 'UIView' transparente. –

1

Mi solución es permitir que el control segmentado cambie su tamaño y oculte el fondo de la vista de tabla en tableView:willDisplayCell:forRowAtIndexPath:.

Esto produce el mismo resultado a la "Settings.app> Wi-Fi> Su red> Dirección IP" Control segmentado y sin codificación dura de ninguna métrica de Presentación:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    UISegmentedControl *control = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]]; 
    control.segmentedControlStyle = UISegmentedControlStylePlain; 
    control.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    control.frame = cell.contentView.bounds; 
    [cell.contentView addSubview:control]; 
    [control release]; 
} 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.backgroundView.alpha = 0.0; 
}