18

UILabel を拡張して、アプリ内の特定のラベル タイプのすべての用途に標準のフォントと色を適用できるようにしました。例えば。

@interface UILabelHeadingBold : UILabel
@end

AppDelegate では、このようにフォントと色を適用します

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

XIB に UILabel を追加するときに、UILabelHeadingBold 型のクラスを選択できるようになり、期待どおりに動作するようになりました。AppDelegate で指定されているように、ラベルは正しいフォントと色で表示されます。

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

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

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

プログラムで作成された UI 要素で UIAppearance を有効にする方法はありますか、それとも XIB 内で使用した場合にのみ機能しますか?

4

5 に答える 5

20

Appleのドキュメントから:

外観のカスタマイズをサポートするには、クラスが UIAppearanceContainer プロトコルに準拠し、関連するアクセサー メソッドが UI_APPEARANCE_SELECTOR でマークされている必要があります。

たとえば、UINavigationBar.hでは、tintColorでマークされています。UI_APPEARANCE_SELECTOR

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

しかし、UILabel.h では、textColorおよびfontプロパティが UI_APPEARANCE_SELECTOR でマークされていないことがわかりますが、Interface Builder に追加すると何らかの形で機能します (ドキュメントに従っていると、まったく機能しません)。

于 2012-08-05T14:24:40.573 に答える
14

問題なく機能している簡単なハックは、UILabel プロパティを変更する UIAppearance セッターを使用してカテゴリを作成することです。

UIAppearance の規則に従って、メソッドを作成しました。

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

UILabel カテゴリ:

@interface UILabel (UISS)

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

@end

元のセッターが機能しない理由をまだ理解しようとしています。

于 2012-12-22T21:25:23.383 に答える
0

@ robert.wijasソリューションはうまく機能します!

iOS 7 以降の場合、彼が使用したキーは 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);
    }
}
于 2014-11-24T22:04:02.203 に答える