2012-10-05 29 views
7

Tengo un ViewController con un fondo radial degradado. Dentro de eso tengo un UITableView con celdas y secciones. Ahora quiero mostrar el degradado detrás de la vista de tabla mientras se desplaza. El problema es que cuando la sección se bloquea en la parte superior, puede ver las celdas detrás de la sección. Establecería el color de fondo de la sección, pero si lo hago, no coincide con el fondo degradado radial. ¿Hay alguna forma de tener el clip de celdas debajo de las secciones mientras se mantiene el fondo clearColor?UITablevista sección con fondo clearColor?

+0

¿Puedes publicar una captura de pantalla? Tener dificultades para visualizar esto. –

+0

Puede establecer tableview.backgroundColor = [UIColor clearColor]; – kamleshwar

Respuesta

8

si lo entiendo, quiere una tabla de visión completamente clara y una celda de tabla para que pueda ver el fondo de su controlador de vista.

Esto se puede conseguir mediante el establecimiento de la tableview como no tener fondo

tableview.backgroundColor = [UIColor clearColor]; 
tableView.opaque = NO; 
tableView.backgroundView = nil; 

y también la célula

cell.backgroundColor = [UIColor clearColor] 

si también desea que la sección sea transparente, puede utilizar este método:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 

para hacer una vista personalizada (por ejemplo, crear una vista de la imagen con un tran t .png para el fondo)

Espero que entienda su pregunta correctamente.


edición después de la clarificación

para dar la apariencia de que las células dejan antes de ir debajo de la sección de encabezado:

crea una clase que es una subclase de UITableView con este Ivar:

@interface CustomTableView : UITableView 
{ 
     CAGradientLayer* maskLayer; 
} 

obviamente, esto creará un gradiente, pero si lo desea, puede modificarlo o usar CALayer y en lugar de crear la máscara mediante programación, cree un .png con el ancho/alto correcto de su encabezado de sección.

todos modos: si se utiliza el CAGradientLayer:

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) 
    { 
     [self setupGradients]; //call your method 
    } 
    return self; 
} 

- (void)setupGradients 
{ 
    [self addObserver:self forKeyPath:@"contentOffset" options:0 context:nil]; 

    */ ***** if you choose to use CALayer instead of CAGradient ****** */ 
    //maskLayer = [[CALayer layer] retain]; 
    //maskLayer.contents = (id) [UIImage imageNamed:@"maskLayer.png"].CGImage; 
    //maskLayer.backgroundColor = [UIColor clearColor].CGColor; 
    */ ***** if you choose to use CALayer instead of CAGradient ****** */ 

    maskLayer = [[CAGradientLayer layer] retain]; 

    CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor; 
    CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor; 

    maskLayer.colors = [NSArray arrayWithObjects:(id)outerColor, 
         (id)innerColor, (id)innerColor, (id)outerColor, nil]; 
    maskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], 
          [NSNumber numberWithFloat:0.0], 
          [NSNumber numberWithFloat:0.9], 
          [NSNumber numberWithFloat:1.0], nil]; //this creates a gradient  effect. Tweak these numbers for a hard line. 

    maskLayer.bounds = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
    maskLayer.anchorPoint = CGPointZero; 

    self.layer.mask = maskLayer; 
    } 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{   
    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 
    maskLayer.position = CGPointMake(0, self.contentOffset.y); 
    [CATransaction commit]; 
} 

entonces en su controlador de vista:

CustomTableView *_tableView; //ivar 

    _tableView = [[CustomTableView alloc] initWithFrame:YOUR_FRAME]; 

La idea básica es una máscara, se crea una forma de la máscara en la parte superior de su tableview ese es el mismo tamaño que su encabezado de sección. parecerá que las células "desaparecen" detrás de él. Es un poco complicado, pero funcionará.

+2

Estás entendiendo lo que estoy tratando de lograr pero no el problema que estoy teniendo. El problema es que mis secciones son transparentes para que pueda ver las celdas a medida que pasan detrás de la sección. Esto crea una mezcla de la celda y la sección que se ve terrible. Agradezco la respuesta, aunque, gracias – Bobbake4

+0

ah lo entiendo ahora. Interesante pregunta. Tengo una idea de cómo puedes hacerlo, pero es un poco hacky. Editaré mi respuesta arriba. – sixstatesaway

10

Forma simple de obtener un encabezado de sección transparente sin crear sus propias vistas de encabezado.

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 
{ 
    if ([view isKindOfClass:[UITableViewHeaderFooterView class]]) { 
     UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view; 
     headerView.contentView.backgroundColor = [UIColor clearColor]; 
     headerView.backgroundView.backgroundColor = [UIColor clearColor]; 
    } 
} 

Esta pieza de código funciona perfectamente bien en IOS 7.

EDITAR Sé que esto es un poco tarde, pero junto con esto hay que añadir 2 líneas asegurándose de que el color de fondo (y el color de fondo de la vista de fondo?) del uitableview también es claro.

tableView.backgroundColor = [UIColor clearColor]; 
tableView.backgroundView.backgroundColor = [UIColor clearColor]; 
+0

¡Perfecto! funcionó para mí. Muchas gracias –

Cuestiones relacionadas