2012-07-03 20 views
13

Wir haben UILabel erweitert, um in unseren Apps Standardschriftarten und -farben für alle Verwendungen eines bestimmten Etikettentyps anwenden zu können. Z.B.UIAppearance wirkt sich nicht auf UILabels aus, die programmgesteuert erstellt wurden

@interface UILabelHeadingBold : UILabel 
@end 

In unserem AppDelegate wenden wir Schriftarten und Farben wie dieses

[[UILabelHeadingBold appearance] setTextColor:<some color>]; 
[[UILabelHeadingBold appearance] setFont:<some font>]; 

Wenn ein UILabel in unserem XIB die hinzugefügt haben, können wir nun die Klasse wählen vom Typ UILabelHeadingBold zu sein, und es funktioniert wie erwartet . Das Etikett wird mit der richtigen Schriftart und Farbe angezeigt, wie in unserem AppDelegate angegeben.

Wenn wir jedoch ein Label programmgesteuert erstellen, z.

UILabelHeadingBold *headingLabel = [[UILabelHeadingBold alloc] initWithFrame:CGRectMake(10, 10, 100, 30)]; 
[self.mainView addSubview:headingLabel]; 

Das UILabel erhält nicht die erwartete Schriftart/Farbe. Wir müssen diese Attribute manuell anwenden.

Gibt es eine Möglichkeit, UIAppearance auf programmatisch erstellte UI-Elemente wirksam werden zu lassen, oder funktioniert es nur, wenn es in XIB verwendet wird?

Antwort

17

Von Apple-Dokumentation:

Aussehen Anpassung zu unterstützen, muß eine Klasse mit dem UIAppearanceContainer Protokoll und relevanten Accessormethoden entsprechen muß mit UI_APPEARANCE_SELECTOR markiert werden.

Zum Beispiel in UINavigationBar.h wird tintColor mit UI_APPEARANCE_SELECTOR

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

markiert Aber in UILabel.h können Sie sehen, dass der textColor und font propertys nicht mit UI_APPEARANCE_SELECTOR markiert, aber irgendwie funktioniert es, wenn im Interface hinzugefügt Builder (nach der Dokumentation sollte es überhaupt nicht funktionieren).

+2

Es * ist * manchmal auch in Code erstellt UILabels arbeiten, aber die Ergebnisse sind widersprüchlich, und das Verhalten ist anders zwischen iOS 5 und, na ja, weißt du. Verwenden Sie einfach nicht UIAppearance, um 'UILabels –

+0

+1 für die Information anzupassen, dass ich nicht die einzige bin, die inkonsistente Ergebnisse erhält (dauerte Stunden Codierung, bis ich Ihren Kommentar gefunden habe). +1 für robert.wijas Lösung - die ich jetzt benutze - und alles ist in Ordnung. – anneblue

14

Einfache Hack, die für mich mit keine Probleme funktioniert, ist eine Kategorie mit einem UIAppearance Setter zu erstellen, die UILabel Eigenschaften ändert.

Nach UIAppearance Konventionen habe ich eine Methode:

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes; 
{ 
    UIFont *font = [numberTextAttributes objectForKey:UITextAttributeFont]; 
    if (font) { 
     self.font = font; 
    } 
    UIColor *textColor = [numberTextAttributes objectForKey:UITextAttributeTextColor]; 
    if (textColor) { 
     self.textColor = textColor; 
    } 
    UIColor *textShadowColor = [numberTextAttributes objectForKey:UITextAttributeTextShadowColor]; 
    if (textShadowColor) { 
     self.shadowColor = textShadowColor; 
    } 
    NSValue *shadowOffsetValue = [numberTextAttributes objectForKey:UITextAttributeTextShadowOffset]; 
    if (shadowOffsetValue) { 
     UIOffset shadowOffset = [shadowOffsetValue UIOffsetValue]; 
     self.shadowOffset = CGSizeMake(shadowOffset.horizontal, shadowOffset.vertical); 
    } 
} 

In UILabel Kategorie:

@interface UILabel (UISS) 

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes UI_APPEARANCE_SELECTOR; 

@end 

Ich bin immer noch versuchen, die ursprüngliche Setter, um herauszufinden, warum nicht funktioniert.

+0

Wir erstellen benutzerdefinierte Eigenschaften in einer Unterklasse, die mit dem Erscheinungsbild-Proxy arbeiten. Z.B. eine Eigenschaft "titleLabelFont", die die Eigenschaft titleLabel.font von UIButton umschließt. Es funktioniert auch für andere Eigenschaften wie Schatten. –

+0

@robert +1 sehr schöne Lösung. Es dauerte Stunden, bis ich deine Antwort fand. Dank dafür. Jetzt funktioniert alles gut (und einfach). – anneblue

+0

Großartige Lösung, das funktioniert auch gut in anderen Ansichten, wie UIButton zum Setzen der titleLabel-Schriftart, da Apple die Methode setFont: verwarf. –

0

@ robert.wijas Lösung funktioniert super!

Für iOS 7 und nach oben Ich hatte den Schlüssel, da einer aktualisieren er für 7+ veraltet verwendet:

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes; 
{ 
    UIFont *font = [numberTextAttributes objectForKey:NSFontAttributeName]; 
    if (font) { 
     self.font = font; 
    } 
    UIColor *textColor = [numberTextAttributes objectForKey:NSForegroundColorAttributeName]; 
    if (textColor) { 
     self.textColor = textColor; 
    } 
    UIColor *textShadowColor = [numberTextAttributes objectForKey:NSShadowAttributeName]; 
    if (textShadowColor) { 
     self.shadowColor = textShadowColor; 
    } 
    NSValue *shadowOffsetValue = [numberTextAttributes objectForKey:NSShadowAttributeName]; 
    if (shadowOffsetValue) { 
     UIOffset shadowOffset = [shadowOffsetValue UIOffsetValue]; 
     self.shadowOffset = CGSizeMake(shadowOffset.horizontal, shadowOffset.vertical); 
    } 
} 
+0

Bitte beachten Sie, dass Sie NSShadowAttributeName Attribut nicht korrekt behandeln; Sein Wert ist NSShadow. –