2012-01-25 14 views
16

Ho un semplice UITableView (non raggruppato) che voglio aggiungere un dropshadow a sinistra ea destra.Aggiunta dell'ombra esterna a UITableView

enter image description here

Come posso raggiungere questo obiettivo? Ho provato:

[self.tableView.layer setShadowColor:[[UIColor whiteColor] CGColor]]; 
[self.tableView.layer setShadowOffset:CGSizeMake(0, 0)]; 
[self.tableView.layer setShadowRadius:5.0]; 
[self.tableView.layer setShadowOpacity:1]; 

ma non funziona.

+4

Ti sei assicurato che 'clipToBounds' e' maskToBounds' siano impostati su 'NO' (per la vista e il layer rispettivamente)? – mattjgalloway

+0

Grazie ragazzo, hai ragione! Se aggiungi una risposta, la contrassegnerò come risposta corretta. –

+0

risposto. Sono contento che l'abbia risolto! – mattjgalloway

risposta

43

È necessario assicurarsi che clipsToBounds e masksToBounds siano impostati su NO rispettivamente sulla vista e sullo strato.

self.tableView.clipsToBounds = NO; 
self.tableView.layer.masksToBounds = NO; 
+4

Grazie per le informazioni. Ma se imposto tableView.layer.masksToBounds = NO; & tableView.clipsToBounds = NO; , la mia tableviewcell si sposta sopra i limiti delle tabelle. Ho tableview, imageview nel mio viewController. Quindi una parte è usata dalla vista tabella e una parte è usata da iamgeview. Puoi aiutarmi con questo? – iOSAppDev

+0

@iOSAppDev Si prega di dare un'occhiata alla mia risposta. Impedirà il problema che stai incontrando. –

+2

È meglio mettere un UIView dietro UITableView e aggiungere l'ombra a UIView. – filou

0

Non è il bianco bagliore che sto vedendo l'ombra? Non hai set offset, quindi sta facendo esattamente quello che vuoi. Per un'ombra, imposta il colore sul nero e assegna un offset di forse 3,5 o qualcosa.

+0

No, quell'immagine è quello che ho cercato di ottenere. Ora ho risolto con il commento mattjgalloway. Grazie comunque. –

4

Vorrei condividere la mia soluzione: Questo richiede di sottoclasse UITableView e aggiungere una proprietà, per il bene della manifestazione chiamiamolo showShadow. Aggiungi questo al file .h della tua vista tabella:

@property (nonatomic,assign) BOOL showShadow;

e il suo corrispondente @synthesize nel file .m per creare metodi getter e setter:

@synthesize showShadow;

quindi aggiungere un iVar UIView *shadowView; al file .h della vista tabella. Ora nel metodo di - (id)initWithFrame:(CGRect)frame vostra sottoclasse UITableView aggiungere il seguente pezzo di codice per impostare la vista che alla fine gettato l'ombra:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     shadowView = [[UIView alloc]initWithFrame:self.frame]; 
     shadowView.backgroundColor = [UIColor whiteColor]; 
     shadowView.layer.shadowOpacity = 0.1; 
     shadowView.layer.shadowOffset = CGSizeMake(3, 3); 
     shadowView.layer.shadowRadius = 1; 



    } 
    return self; 
} 

E, infine, scrivere il metodo setter per mostrare/nascondere l'ombra:

-(void)setShowShadow:(BOOL)s{ 

    showShadow = s; 

    if(s){ 
     [self.superview insertSubview:shadowView belowSubview:self]; 
    }else{ 
     [shadowView removeFromSuperview]; 
    } 
} 

inoltre, se vuoi spostare il tavolo (per qualsiasi motivo), è necessario eseguire l'override del metodo -setFrame: per spostare anche la shadowView con esso (in quanto non è nella gerarchia della vista della vista tabella):

-(void)setFrame:(CGRect)frame{ 

    [super setFrame:frame]; 
    shadowView.frame = frame; 

} 

Le ombre sono state abilitate correttamente! Utilizzare in questo modo:

MySubclassedTableView *table = [[MySubclassedTableView alloc]initWithFrame:CGRectMake(20, 200, 280, 200)]; 
     [self.view addSubview:table]; 
     table.showShadow = YES; 

ATTENZIONE:

È necessario impostare la proprietà showShadow DOPO si aggiunge la visualizzazione tavolo, perché la linea table.showShadow chiamerà la linea [auto .superview insertSubview: shadowView belowSubview: self]; che richiede che la vista tabella sia esistente.

Problemi correlati