2012-10-05 13 views
7

Ho un ViewController con uno sfondo sfumato radiale. Dentro che ho un UITableView con celle e sezioni. Ora voglio mostrare il gradiente dietro la vista del tavolo mentre scorri. Il problema è che quando la sezione si blocca in alto puoi vedere le celle dietro la sezione. Vorrei impostare il colore di sfondo della sezione, ma se lo faccio non corrisponde allo sfondo sfumato radiale. Esiste comunque la possibilità di inserire le celle sotto le sezioni mantenendo lo sfondo clearColor?Sezione UITableView con sfondo clearColor?

+0

puoi pubblicare una schermata? Avere difficoltà a visualizzare questo. –

+0

È possibile impostare tableview.backgroundColor = [UIColor clearColor]; – kamleshwar

risposta

8

se ho capito, si desidera una vista tabella e una cella tableview completamente chiare in modo da poter vedere lo sfondo del controller di visualizzazione.

È possibile raggiungere questo impostando la Tableview come privo di sfondo

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

e anche la cellula

cell.backgroundColor = [UIColor clearColor] 

se si desidera anche la sezione di essere trasparente, è possibile utilizzare questo metodo:

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

per creare una vista personalizzata (ad esempio creare una vista di immagine con una trasparenza t .png per lo sfondo)

Spero di aver compreso correttamente la tua domanda.


modifica dopo chiarimento

per dare l'apparenza che le cellule smettono prima di andare sotto l'intestazione della sezione:

fare una classe che è una sottoclasse di UITableView con questo Ivar:

@interface CustomTableView : UITableView 
{ 
     CAGradientLayer* maskLayer; 
} 

ovviamente questo creerà un gradiente ma se si volesse si potrebbe modificarlo o utilizzare CALayer e invece di creare la maschera al livello di programmazione, creare un file .png con la larghezza/altezza corretta dell'intestazione della sezione.

in ogni caso: se si utilizza il 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]; 
} 

poi nel vostro controller della vista:

CustomTableView *_tableView; //ivar 

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

L'idea di base è una maschera, si crea una forma maschera sulla parte superiore della vostra Tableview ha le stesse dimensioni dell'intestazione della sezione. sembrerà che le cellule "scompaiano" dietro di esso. È un po 'complicato, ma funzionerà.

+2

Stai capendo cosa sto cercando di ottenere ma non il problema che sto avendo. Il problema è che le mie sezioni sono trasparenti in modo da poter vedere le celle mentre passano dietro la sezione. Questo crea un mix di cella e sezione che sembra terribile. Apprezzo la risposta però, grazie – Bobbake4

+0

ah capisco ora. Domanda interessante Ho un'idea di come puoi farlo, ma è un po 'hacky. Modificherò la mia risposta sopra. – sixstatesaway

10

Un modo semplice per ottenere un'intestazione di sezione trasparente senza creare le proprie viste di intestazione.

- (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]; 
    } 
} 

Questo pezzo di codice funziona perfettamente bene in iOS 7.

EDIT So che questo è un po 'tardi, ma insieme a questo si deve aggiungere 2 righe assicurandosi il colore di sfondo (e il colore di sfondo della vista di sfondo?) della uitableview è anche chiaro.

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

Perfetto! ha funzionato per me. Grazie mille –

Problemi correlati