2012-07-03 15 views
13

私たちは、アプリケーションで指定されたラベルタイプのすべての用途に標準のフォントと色を適用できるようにUILabelを拡張しました。例えば。私たちのAppDelegateでUIAppearanceはプログラムで作成されたUILabelsには適用されません

@interface UILabelHeadingBold : UILabel 
@end 

は、私たちはXIB年代にUILabelを追加するとき、私たちは今のタイプUILabelHeadingBoldであるようにクラスを選択することができ、この

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

のようなフォントや色を適用し、期待どおりに動作します。ラベルは、AppDelegateで指定されている正しいフォントと色で表示されます。

ただし、ラベルをプログラムで作成すると、

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

UILabelは、期待されるフォント/色が適用されません。これらの属性を手動で適用する必要があります。

UIAppearanceをプログラムによって作成されたUI要素に反映させる方法はありますか、それともXIB内で使用する場合にのみ機能しますか?アップルのドキュメントから

答えて

17

:外観のカスタマイズをサポートする

、クラスが UIAppearanceContainerプロトコルと関連するアクセサメソッドに準拠する必要がありますUI_APPEARANCE_SELECTORで をマークする必要があります。 UINavigationBar.hで例えば

tintColorUI_APPEARANCE_SELECTOR

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

でマークされている。しかしUILabel.hに、あなたはtextColorfont propertysがUI_APPEARANCE_SELECTORでマークされたが、インターフェイスに追加したとき何とかそれが動作していないことがわかりますビルダー(ドキュメントに続いて、それはまったく動作しません)。

+2

が、結果は矛盾していますiOS 5では動作が異なり、まあ、あなたも知っています。ですから、UILabelの –

+0

+1をカスタマイズするために 'UIAppearance'を使用しないでください。私は矛盾した結果を得る唯一の人ではありません。 +1、私が今使っているrobert.wijasの解決策 - そしてすべては問題ありません。 – anneblue

14

私にとって問題のない単純なハックは、UILabelのプロパティを変更するUIAppearanceセッターでカテゴリを作成することです。 UILabelカテゴリで

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

後UIAppearance規則は、私は、メソッドを作成し、私はまだ元のセッターが動作しない理由を把握しようとしている

@interface UILabel (UISS) 

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

@end 

+0

外観プロキシで動作するサブクラスでカスタムプロパティを作成します。例えば。 UIButtonのtitleLabel.fontプロパティをラップする "titleLabelFont"プロパティ。影など、他のプロパティにも機能します。 –

+0

@robert +1とても良い解決策です。私はあなたの答えを見つけるまで、時間をかけてコーディングをしました。ありがとうございました。さて、すべてがうまくいく(そして単純な)。 – anneblue

+0

これは、アップル社がsetFont:メソッドを非推奨にしてtitleLabelフォントを設定するためのUIButtonなど、他のビューでもうまく機能します。 –

0

@ robert.wijasソリューションは素晴らしいです! iOSの7のために

と上向きに私は彼が使用したものが7+のために廃止されましたので、キーを更新する必要がありました:、それは* *時々あまりにもコードで作成されたUILabelsのために働くん

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

NSShadowAttributeName属性を正しく処理していないことに注意してください。その値はNSShadowです。 –

関連する問題