We have extended UILabel to be able to apply standard fonts and colors for all uses of a given label type in our apps. Eg.
@interface UILabelHeadingBold : UILabel
@end
In our AppDelegate, we apply fonts and colors like this
[[UILabelHeadingBold appearance] setTextColor:<some color>];
[[UILabelHeadingBold appearance] setFont:<some font>];
When adding a UILabel in our XIB's, we can now select the class to be of type UILabelHeadingBold, and it works as expected. The label is shown with the correct font and color, as specified in our AppDelegate.
However, if we create a label programmatically, eg.
UILabelHeadingBold *headingLabel = [[UILabelHeadingBold alloc] initWithFrame:CGRectMake(10, 10, 100, 30)];
[self.mainView addSubview:headingLabel];
the UILabel does not get the expected font/color applied. We have to manually apply these attributes.
Is there a way to make UIAppearance take effect on programatically created UI elements, or does it only work when used within XIB's?
Simple hack that is working for me with no issues is to create a category with a UIAppearance setter that modifies UILabel properties.
Following UIAppearance conventions I created a method:
In UILabel category:
I'm still trying to figure out why the original setter does not work.
From Apple documentation :
For example in
UINavigationBar.h
,tintColor
is marked withUI_APPEARANCE_SELECTOR
But in UILabel.h you can see that the
textColor
andfont
propertys are not marked with UI_APPEARANCE_SELECTOR but somehow it works when added in Interface Builder (following the documentation it shouldn't work at all).A workaround that I've used is to manually apply the color from the appearance that is set:
This way you don't need to reference anything new, or explicitly define the color. This also works for context specific coloring:
I was having this exact same issue, but in Swift. A custom
UILabel
's appearance would work if added from a storyboard, but not if added from code.Here's a solution I found in Swift that's working for me:
Then add these lines where you configure your app appearance:
@robert.wijas solution works great !
For iOS 7 and upwards I had to update the key since the one he used are deprecated for 7+ :