Aggiornamento: Suggerirei di iniziare comprendendo le API UIAppearance
e vedendo quanto soddisfano le proprie esigenze. UIAppearance
è un modo conveniente per fornire la stilizzazione predefinita personalizzata di attributi di controlli specifici a più livelli (ad esempio globalmente o contestualmente).
La mia risposta originale, che ha preceduto UIAppearance
's disponibilità:
dato che stiamo lavorando con un linguaggio basato oggetto ...
per l'implementazione, dipende su come vuoi che si comporti/esegua. quando l'implementazione diventa non banale, creerò spesso un protocollo. è possibile utilizzare metodi di classe o di metodi di istanza e significativamente ottimizzare questi tipi per il vostro uso, perché si crea un minor numero di colori intermedi, font, immagini, ecc
un'interfaccia di base potrebbe assumere la forma:
@protocol MONLabelThemeProtocol
- (UIFont *)labelFont;
- (UIColor *)labelTextColor;
- (UITextAlignment)labelTextAlignment;
// ...
@end
@protocol MONTableViewCellThemeProtocol
- (UIFont *)tableViewCellFont;
- (UIColor *)tableViewCellTextColor;
- (UIImage *)tableViewCellImage;
- (NSInteger)tableViewCellIndentationLevel;
- (CGFloat)tableViewCellIndentationWidth;
// ...
@end
poi un tema semplice amalgamare potrebbe essere dichiarato così:
@interface MONAmalgamateThemeBase : NSObject
< MONLabelThemeProtocol, MONTableViewCellThemeProtocol >
{
@protected
/* labels */
UIFont * labelFont;
UIColor * labelTextColor;
UITextAlignment labelTextAlignment;
// ...
/* table view cells */
UIFont * tableViewCellFont;
UIColor * tableViewCellTextColor;
UIImage * tableViewCellImage;
NSInteger tableViewCellIndentationLevel;
CGWidth tableViewCellIndentationWidth;
// ...
}
@end
in questo esempio, l'amalgamare definisce i getter e dealloc e si attende che le sottoclassi per inizializzare le variabili di istanza. è anche possibile supportare l'inizializzazione pigra se i tempi di inizializzazione sono elevati (ad esempio utilizza molte immagini).
poi una specializzazione potrebbe assumere la forma:
@interface MONDarkTheme : MONAmalgamateThemeBase
@end
@implementation MONDarkTheme
- (id)init
{
self = [super init];
if (nil != self) {
labelFont = [[UIFont boldSystemFontOfSize:15] retain];
labelTextColor = [[UIColor redColor] retain];
// and so on...
}
return self;
}
// ...
@end
/* declare another theme and set it up appropriately */
@interface MONLightTheme : MONAmalgamateThemeBase
@end
poi basta riutilizzare le istanze a tema (ad esempio MONDarkTheme) in tutta l'applicazione per stilizzare i punti di vista. se hai molti temi o non sono banali da costruire, allora potresti voler creare una collezione per temi (gestore temi). l'amalgamato potrebbe anche prendere un parametro, come init con tema se le tue esigenze sono semplici. puoi anche configurare oggetti da registrare per le modifiche ai temi, se hai bisogno di supporto per le modifiche dinamiche.
, infine, è possibile creare un semplice applicatore tema per rendere la vita più facile - in questo modo:
@interface UILabel (MONThemeAdditions)
- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme;
@end
@implementation UILabel (MONThemeAdditions)
- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme
{
assert(theme);
if (nil == theme) return;
self.font = [theme labelFont];
self.textColor = [theme labelTextColor];
self.textAlignment = [theme labelTextAlignment];
}
@end
Potrebbe essere necessario guardare questa libreria. Supporta più temi/skin al volo. Supporta immagini e colori al momento. Il supporto per i caratteri verrà aggiunto in futuro. https://github.com/charithnidarsha/MultiThemeManager –