2011-11-29 8 views
22

Se si imposta l'attributo backgroundColor su un UITableViewCell raggruppato, il colore dello sfondo cambia con successo. Grande.iOS: utilizzo della funzionalità UIA per definire il colore personalizzato UITableViewCell

Ma mi piacerebbe utilizzare UIAParance per cambiare il colore di sfondo su tutti i miei UITableViewCells, quindi posso farlo in un posto e influenzare un cambiamento ovunque. Ecco il mio codice:

[[UITableViewCell appearance] setBackgroundColor:[UIColor colorWithRed:30.0/255.0 green:30.0/255.0 blue:30.0/255.0 alpha:1.0]]; 

UITableViewCell implementa UIAppearance e UIAppearanceContainer, quindi avrei pensato che avrebbe funzionato. Ma non è così. Ho anche provato a utilizzare -[UITableViewCell appearanceWhenContainedIn:(Class)] e anche questo non funziona.

Qualche idea?

risposta

41

Aggiornamento (2013/7/8) - Questo problema è stato corretto nelle versioni più recenti di iOS. Tuttavia, vale la pena di sapere se stai prendendo di mira iOS 6 o versioni precedenti.

Si può incolpare Apple per questo, ed è in realtà piuttosto cattivo di loro. Tecnicamente, backgroundColornon è personalizzabile tramite proxy di aspetto.

Dalla documentazione di Apple:

Per supportare la personalizzazione aspetto, una classe deve essere conforme al protocollo UIAppearanceContainer e metodi di accesso rilevanti devono essere contrassegnati con UI_APPEARANCE_SELECTOR.

Se entriamo in una classe come UIBarButtonItem e guardiamo la proprietà tintColor vediamo questa:

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR; 

Quindi perché è contrassegnato con il tag UI_APPEARANCE_SELECTOR sappiamo che funziona con UIAppearance.

Ecco dove Apple sono particolarmente media: in un UIView, backgroundColorNessun tag selettore aspetto, ma ancora funziona con UIAppearance. Secondo tutta la documentazione fornita da Apple non dovrebbe, ma lo fa!

Questo dà l'impressione fuorviante che funzionerà per tutte le sottoclassi di UIView, incluso UITableView. Questo è venuto prima, in this previous SO answer

Così la linea di fondo è che backgroundColor non dovrebbe funzionare affatto con UIAppearance, ma per qualche ragione lo fa su un UIView. Non è garantito il funzionamento delle sottoclassi UIView e non funziona affatto su UITableView. Mi spiace di non poterti dare una risposta più positiva!

+0

Grazie per la spiegazione. Probabilmente avrei trascorso alcune ore annuendo con la testa contro il muro a causa di questo. – matsr

+0

Sì, ottima risposta. Grazie! –

+0

Se questo è qualcosa che ti infastidisce davvero (mi infastidisce!), Inserisci sicuramente un bug report con Apple. Non penso che sia davvero un "bug" di per sé, ma è sicuramente una carenza. Penso che potrei aver visto qualcuno di Apple usare 'setBackgroundColor' in una demo di codice una volta sui proxy di aspetto. – lxt

17

È possibile creare la propria sottoclasse di UITableViewCell conforme a UIAppearance e contrassegnare un setter personalizzato con UI_APPEARANCE_SELECTOR. Quindi imposta la cella backgroundColor sul superlass dal tuo setter personalizzato.

Nella tua AppDelegate

[[CustomCell appearance] setBackgroundCellColor:[UIColor redColor]]; 

Nella tua UITableView sottoclasse

@interface CustomCell : UITableViewCell <UIAppearance> 

@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR; 

@implementation CustomCell 

@synthesize backgroundCellColor; 

-(void)setBackgroundCellColor:(UIColor *)backgroundColor 
{ 
    [super setBackgroundColor:backgroundColor]; 
} 

sto usando ARC in questo esempio.

+0

Anche senza sottoclassi, è possibile utilizzare una categoria e proprietà personalizzate per le chiamate di aspetto proxy. Può essere utile se si desidera applicare a tema una parte in cui non è possibile utilizzare una sottoclasse (ad esempio per 'UIPrintInteractionController'). – Tom

0

Ho usato la categoria per questo. Di seguito è riportato il codice di esempio Nel file .h scrivere

*@interface UITableViewCell (MyCustomCell) 
@property (nonatomic, weak) UIColor *backgroundCellColor UI_APPEARANCE_SELECTOR; 
@end* 

Nel file .m scrivere

*@dynamic backgroundCellColor; 
-(void)setBackgroundCellColor:(UIColor *)backgroundColor 
{ 
    [super setBackgroundColor:backgroundColor]; 
}* 

Ha funzionato bene per me. :) Grazie Nate !!!

3

Senza sottoclasse! Fare questo in una sottoclasse NON è probabilmente la procedura migliore, specialmente se si desidera colpire tutti gli sfondi tableView. È un sacco di sottoclassi. Un sacco di potenziali bug. Un casino davvero. Il modo migliore per farlo è usare una categoria. Dovrai impostarne uno per TableViewCell e TableView. Dimostrerò solo quello per la cellula. La proprietà sul tavoloView che devi fare è la proprietà backgroundColor. NB. Sto prepensionando i miei metodi con "sat".

// .h

#import <UIKit/UIKit.h> 

@interface UITableViewCell (Appearance)<UIAppearance> 
@property (strong, nonatomic) UIColor *satBackgroundColor UI_APPEARANCE_SELECTOR; 
@end 

// .m

#import "UITableViewCell+Appearance.h" 

@implementation UITableViewCell (Appearance) 

- (UIColor *)satBackgroundColor 
{ 
    return self.backgroundColor; 
} 

- (void)setSatBackgroundColor:(UIColor *)satBackgroundColor 
{ 
    self.backgroundColor = satBackgroundColor; 
} 


@end 

Ora nel tuo AppDelegate o una certa classe dirigente si importare la categoria e lo chiamano semplicemente come se avesse un aspetto proxy integrato.

UITableViewCell *cell = [UITableViewCell appearance]; 
cell.satBackgroundColor = [UIColor orangeColor]; 

Ok, ora basta fare quello per la proprietà di background di tableView. Semplice.

Problemi correlati