2012-07-03 14 views
13

Rozszerzyliśmy UILabel, aby móc stosować standardowe czcionki i kolory dla wszystkich zastosowań danego typu etykiety w naszych aplikacjach. Na przykład.UIAppearance nie przynosi efektu na programach UILabel utworzonych programowo

@interface UILabelHeadingBold : UILabel 
@end 

W naszej AppDelegate stosujemy czcionek i kolorów jak ten

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

Dodając UILabel w naszych XIb, możemy teraz wybrać klasę być typu UILabelHeadingBold i działa zgodnie z oczekiwaniami . Etykieta jest wyświetlana z poprawną czcionką i kolorem, zgodnie z opisem w naszym AppDelegate.

Jeśli jednak utworzymy etykietę programowo, np.

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

UILabel nie otrzymuje oczekiwanej czcionki/koloru. Musimy ręcznie zastosować te atrybuty.

Czy istnieje sposób, aby UIAppearance zadziałał na programowo stworzonych elementach interfejsu użytkownika, czy działa tylko wtedy, gdy jest używany w XIB-ach?

Odpowiedz

17

Z dokumentacji Apple:

Aby wspierać dostosowywanie wyglądu, klasy muszą być zgodne z protokołem UIAppearanceContainer i odpowiednich metod dostępowych należy oznaczone UI_APPEARANCE_SELECTOR.

Na przykład w UINavigationBar.h, tintColor oznaczona UI_APPEARANCE_SELECTOR

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

Ale w UILabel.h widać, że textColor i font propertys nie są zaznaczone UI_APPEARANCE_SELECTOR ale jakoś to działa po dodaniu w interfejsie Builder (po dokumentacji nie powinien w ogóle działać).

+2

To * nie * czasami pracować UILabels utworzonych w kodzie też, ale wyniki są niespójne, a zachowanie jest inne między iOS 5 i, no cóż, wiesz. Więc po prostu nie używaj 'UIAppearance' do dostosowywania' UILabel's –

+0

+1 dla informacji, że nie jestem jedyny, który dostaje niespójne wyniki (zabrało mi godziny kodowania, dopóki nie znalazłem twojego komentarza). +1 dla rozwiązania robert.wijas - którego używam teraz - i wszystko jest w porządku. – anneblue

14

Prostym hackiem, który działa dla mnie bez problemów jest utworzenie kategorii z seterem UIAppance, który modyfikuje właściwości UILabel.

następujące konwencje UIAppearance I stworzył metodę:

- (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); 
    } 
} 

W kategorii UILabel:

@interface UILabel (UISS) 

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

@end 

Ja wciąż próbuje dowiedzieć się, dlaczego oryginalny seter nie działa.

+0

Tworzymy niestandardowe właściwości w podklasie, która działa z serwerem proxy wyglądu. Na przykład. właściwość "titleLabelFont" do zawijania właściwości titleLabel.font UIButton. Działa również dla innych właściwości, takich jak cienie. –

+0

@robert +1 bardzo ładne rozwiązanie. Zajęło mi to długie godziny, aż znalazłem twoją odpowiedź. Dziękuję za to. Teraz wszystko działa dobrze (i jest proste). – anneblue

+0

Świetne rozwiązanie, działa to również w innych widokach, takich jak UIButton do ustawiania czcionki titleLabel jako Apple wycofał metodę setFont :. –

0

@ robert.wijas rozwiązanie działa świetnie!

Dla iOS 7 i wzwyż musiałem zaktualizować klucz od czasu jednego używał są przestarzałe na 7+:

- (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

Należy pamiętać, że nie obsługujesz poprawnie atrybutu NSShadowAttributeName; jego wartość to NSShadow. –

Powiązane problemy