2012-01-30 26 views
7

Tengo un UITableView de estilo regular, el que tiene un fondo blanco y líneas horizontales grises para separar las filas.Poner una vista personalizada en un UITableView

Tengo otra UIView personalizada que es solo un rectángulo de 100x100 lleno de redColor.

¿Cómo puedo poner este último en el anterior, de modo que aparece sobre líneas horizontales, pero sigue siendo una "parte" de la vista de tabla en el sentido de que cuando me desplazo por la vista de tabla, el rojo ver desplaza con eso? De hecho, también debería poder poner mi dedo sobre el área roja y desplazarme por la vista de tabla.

Una vez más, si la vista roja se superpone a algunas líneas horizontales, debería aparecer sobre líneas. Tristemente, cuando solo agrego la vista roja como una subvista a la vista de tabla, las líneas horizontales pasan por la vista roja; ver this screenshot.

¿Cómo se puede lograr esto?

+0

¿quieres que la vista roja ocultará el contenido líneas ???? – shannoga

Respuesta

5

EDITAR

Si está intentando agregar la vista a por encima de las líneas (oculte las líneas) intente utilizar – bringSubviewToFront: para llevarlo al frente de la vista de tabla.

[self.tableView bringSubviewToFront:redView]; 

ELSE

Añadir la vista al self.tableView.tableHeaderView esto lo colocará por encima de la vista de tabla y se desplazará a la vista de tabla.

UIView *redView = [[UIView alloc]init]; 
    redView.frame = //set the frame 
    redView.backgroundColor = [UIColor redColor]; 
    self.tableView.tableHeaderView = redView; 

buena suerte

+0

'bringSubviewToFront:' hizo el truco, gracias. No había necesidad de que lo llamara varias veces (en lugares como 'scrollViewDidScroll:' o 'layoutSubviews') como sugirieron algunos otros aquí. Acabo de inicializar mi vista roja en' viewWillAppear: '(en la subclase' UITableViewController') y luego llamé 'bringSubviewToFront:' en 'viewDidAppear '(Puse la vista roja en una variable de instancia). Esto funcionó muy bien para mí. – Enchilada

+0

Eres bienvenido – shannoga

0

Haga que su vista sea una subvista de cualquier subvista normal del UITableView: un encabezado, un pie de página o cualquier UITableViewCell.

+0

Eso no le garantizaría estar frente a los divisores. De hecho, eso ni siquiera garantizaría que fuera visible fuera de su vista de contactor – Ahti

1

Sólo tiene que añadir esta vista para UITableView como subvista:

[tableView addSubview:myRedView]; 

Ver userInteractionEnabled propiedad con el fin de manejar la interacción y el desplazamiento.

+0

El problema con esto es que las líneas horizontales de la vista de tabla se superponen con la vista roja. La vista roja debe ser ** por encima de ** las líneas horizontales. ¿Alguna idea adicional? – Enchilada

+1

@Enchilada, No, la vista roja se encuentra en la parte superior de UITableView. Acabo de crear desde cero un nuevo proyecto y escribo 3 líneas de código en viewWillAppear, vea el resultado aquí - http://img585.imageshack.us/img585/3584/screenshot20120131at112.png – beryllium

+0

Extraño, eso no es lo que sucede aquí. Aquí está mi captura de pantalla: http://i.stack.imgur.com/Ooaf0.png ¿Alguna idea de por qué nuestros resultados difieren? – Enchilada

0

Creo que lo que ha descrito se puede lograr mejor utilizando un UITableViewCell o incluso una subvista del encabezado. Una celda tiene la capacidad inherente de desplazarse por la tabla y se puede personalizar de la forma que desee. Es esencialmente una vista.

En su situación, por ejemplo, es posible que desee que aparezca el cuadro rojo de forma predeterminada en la parte superior de la tabla. Haría de la primera celda una celda de "caja roja", donde insertaría su casilla roja en la vista de contenido de la celda.

0

Por lo tanto, su problema es básicamente que las UITableViewCells de una UITableView se agregan como subvistas dinámicamente y no puede controlar si se agregan al frente o detrás de su vista.

Para mantener su vista en la parte delantera, debe volver a colocarla allí cada vez que se agreguen celdas, lo que ocurre cuando se desplaza la UITableView.

yo sugeriría que intenta añadir la vista personalizada como una vista secundaria y luego anular -scrollViewDidScroll así:

- (void)scrollViewDidScroll { 
    [super scrollViewDidScroll]; 
    // myCustomView is your custom view referenced in an IVar 
    [self.tableView bringSubviewToFront:myCustomView]; 
} 
0

Editar su delegado viewWillAppear con estas líneas

UIView *redView=[[UIView alloc]initWithFrame:CGRectMake(30,30, 100, 100)]; 
redView.backgroundColor=[UIColor redColor]; 
[self.tableView addSubview:redView]; 
12

El lugar correcto para manejar el orden de apilamiento de su cuadrado rojo es en el método layoutSubviews. La vista de tabla se envía a sí misma layoutSubviews cada vez que agrega o elimina subvistas (y en otros momentos).

Usted necesita hacer una subclase de UITableView que tiene una referencia a la plaza roja:

@interface MyTableView : UITableView 

@property (weak, readonly) IBOutlet UIView *redSquare; 

@end 

Puede inicializar redSquare en cualquier forma que desee. Acabo de poner en mis punta junto con la vista de tabla, y se trasladó a ser una vista secundaria de la tabla general awakeFromNib:

@implementation MyTableView 

@synthesize redSquare = _redSquare; 

- (void)awakeFromNib { 
    [self addSubview:self.redSquare]; 
} 

De todos modos, para hacer realidad de que el cuadrado rojo siempre está encima de la mesa células y líneas de la cuadrícula, anular layoutSubviews así:

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    [self bringSubviewToFront:self.redSquare]; 
} 
+0

Exactamente. La UITableView se retransmite cada vez que se agrega o quita una celda. Las celdas son en realidad solo subvistas de la tabla, y podrían ser en cualquier orden. –

+0

¿Podría decirme cómo hace lo que menciona en caso de que no esté usando un archivo XIB? ¿Cómo puedo especificar una subclase personalizada sin usar XIB? Inicializo mi 'UIT las subclases de ableViewController' programmatically, y todo lo que hago está en el código solamente. – Enchilada

+0

En algún lugar su código dice '[[UITableView alloc] init ...]'. Necesita hacer que diga '[[MyTableView alloc] init ...]' y establecer su propiedad 'redSquare'. –

Cuestiones relacionadas