2012-02-02 4 views
7

Ho cercato questo forum, Google e altri forum e non ho trovato una risposta al mio particolare problema.UITableView con gradiente trasparente in alto e in basso

Fondamentalmente, ho uno UIView che contiene UITableView. Ho seguito questo tutorial ed è stato parzialmente positivo. Il problema è il gradiente. Ho un'immagine di sfondo dietro allo UITableView. Quindi, man mano che la cella si avvicina al gradiente, voglio che venga mostrato lo sfondo, anziché il bianco.

Ho trovato anche questo post quale è il luogo in cui ho trovato il tutorial, ma non volevo dirottarlo con le mie stesse domande per Matt.

Qualsiasi aiuto nella giusta direzione sarebbe fantastico!

EDIT1: So che posso usare un'altra immagine con l'immagine di sfondo e il centro tagliato, ma sto cercando una soluzione che EVITA usando PNG, se possibile.

EDIT2: Ecco un'immagine di ciò che ho adesso:

enter image description here

Edit3:

Ecco il mio codice:

Intestazione:

@interface MyView : UIViewController { 
    CAGradientLayer *_maskLayer; 
    UITableView *_tableView; 
} 

@property (nonatomic, retain) CAGradientLayer *maskLayer; 
@property (nonatomic, retain) IBOutlet UITableView *tableView;

Implementazione:

@implementation HighScoresView_iPhone 

@synthesize tableView = _tableView; 
@synthesize maskLayer = _maskLayer; 

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    if (![self maskLayer]) { 
     [self setMaskLayer:[CAGradientLayer layer]]; 
     CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor; 
     CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor; 

     [[self maskLayer] setColors:[NSArray arrayWithObjects: 
            (id)outerColor, 
            (id)innerColor, 
            (id)innerColor, 
            (id)outerColor, 
            nil 
            ] 
     ]; 
     [[self maskLayer] setLocations:[NSArray arrayWithObjects: 
             [NSNumber numberWithFloat:0.0], 
             [NSNumber numberWithFloat:0.2], 
             [NSNumber numberWithFloat:0.8], 
             [NSNumber numberWithFloat:1.0], 
             nil 
             ] 
     ]; 
     [[self maskLayer] setBounds:CGRectMake(0, 0, [[self scoreTableView] frame].size.width, [[self scoreTableView] frame].size.height)]; 
     [[self maskLayer] setAnchorPoint:CGPointZero]; 
     [[[self scoreTableView] layer] addSublayer:[self maskLayer]]; 
    } 
}
+0

Non è consigliato per motivi di ottimizzazione, ma hai provato 'cell.backgroundView.backgroundColor = [UIColor clearColor]' o lo stesso per 'contentView' o per 'cell' stessa, o qualche combinazione di questi? – bshirley

+0

sì, le mie celle hanno uno sfondo chiaro. Riesco a vedere lo sfondo quando sono al centro. Ma quando sono vicini alla parte superiore o inferiore, il gradiente che ho creato seguendo il tutorial che ho menzionato, vedo il bianco, invece del contenuto che scompare. – RoLYroLLs

+0

Ho aggiunto un'immagine per mostrare come appare attualmente. – RoLYroLLs

risposta

0

Sembra che il colore di sfondo della vista tabella sia impostato su bianco. Provare a impostare lo sfondo del vostro vista tabella a trasparente:

tableView.backgroundColor = [ UIColor clearColor ] ; 
tableView.opaque = NO ; 
+0

(puoi farlo nel costruttore di interfacce) – nielsbot

+0

sì, ho lo sfondo di 'UITableView' chiaro. Si può dire perché nell'immagine si vedono i dischi di sfondo nero e verde acqua. Tuttavia ho opaco impostato su "SÌ". Anche se impostato su "NO", lo stesso risultato. – RoLYroLLs

20

È possibile farlo con la proprietà CALayermask. Ma non è possibile impostare la maschera sul proprio layer della vista tabella perché quella maschera scorrerà con le righe della tabella. Invece, metti la tua vista tabella in una nuova superview (della classe UIView) che crei solo per questo. Chiamalo tableMaskView.

Il nuovo superview dovrebbe avere la sua proprietà backgroundColor impostata UIColor.clearColor e la sua proprietà opaque impostata NO. Quindi è possibile impostare la sua maschera in questo modo:

CAGradientLayer *gradient = [CAGradientLayer layer]; 
gradient.frame = self.tableMaskView.bounds; 
gradient.colors = [NSArray arrayWithObjects: 
    (__bridge id)UIColor.clearColor.CGColor, 
    UIColor.whiteColor.CGColor, 
    UIColor.whiteColor.CGColor, 
    UIColor.clearColor.CGColor, 
    nil]; 
gradient.locations = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0], 
    [NSNumber numberWithFloat:1.0/16], 
    [NSNumber numberWithFloat:15.0/16], 
    [NSNumber numberWithFloat:1], 
    nil]; 
self.tableMaskView.layer.mask = gradient; 

Utilizzando una maschera di livello non è il modo più efficiente, ma è il più facile da programmare. Verifica se è abbastanza veloce.

+0

Ciao Rob, grazie per il tuo codice, ma quello che sta facendo è mettere un blocco bianco nel mezzo e gli esterni (superiore e inferiore) sono sfumati in chiaro. Ciò nasconde il contenuto nel mezzo. – RoLYroLLs

+0

È necessario impostare tableMaskView.opaque su NO e tableMaskView.backgroundColor su clearColor. –

+0

sì, ha fatto. Qualunque altra cosa? – RoLYroLLs

0

Sostituire questa linea:

[[[self scoreTableView] layer] addSublayer:[self maskLayer]]; 

Con questo:

self.scoreTableView.layer.mask = self.maskLayer; 

(O se ti ostini a vostra sintassi-styling anche pensato che non riesco a capire perché):

[[[self scoreTableView] layer] setMask:[self maskLayer]]; 

Anche la risposta this potrebbe aiutarti.

0

Swift 3 versione di rob mayoff s' answer:

let gradient = CAGradientLayer() 
gradient.frame = tableMaskView.bounds 
gradient.colors = [UIColor.clear.cgColor, UIColor.white.cgColor, 
        UIColor.white.cgColor, UIColor.clear.cgColor] 
gradient.locations = [0 as NSNumber, 1.0/16.0 as NSNumber, 
         15.0/16.0 as NSNumber, 1 as NSNumber] 
tableMaskView.layer.mask = gradient