属性付きラベルを作る その2


前回の続き。Cocoa touchで属性付き文字列を表示するラベルを作ろう。

今回は、属性を追加するためのメソッドを追加してみる。太字の属性。それと、文字の前景色の属性。

これらの設定を行うために、専用のメソッドを用意してみた。addBoldFontAttrWithRange:と、addForegroundColorAttrWithColor:range:だ。範囲と、前景色の場合は色とを指定する。

// Attributes
- (void)addBoldFontAttrWithRange:(NSRange)range;
- (void)addForegroundColorAttrWithColor:(UIColor*)color range:(NSRange)range;

これらのメソッドの実装は、指定した範囲と色をインスタンス変数に格納するだけ。実際に文字列に属性を付加するのは、前回説明した_refreshAttributedStringメソッドの中になる。

では、その拡張された実装を。最初の部分は変化なし。フォント属性の追加のところで、太字属性に関する記述が新たに追加されている。

    ...

    //
    // Set font attribute
    //

    // Set normal font attribute
    CTFontRef   ctFont;
    ctFont = CTFontCreateWithName(
            (CFStringRef)self.font.fontName,
            self.font.pointSize,
            NULL);
    [_attrStr addAttribute:(NSString*)kCTFontAttributeName
            value:(id)ctFont range:NSMakeRange(0, length)];

    // Get bold font ranges
    UIFont*     boldFont;
    CTFontRef   ctBoldFont;
    boldFont = [UIFont boldSystemFontOfSize:12.0f];
    ctBoldFont = CTFontCreateWithName(
            (CFStringRef)boldFont.fontName, self.font.pointSize, NULL);
    for (NSValue* boldFontRangeValue in _boldFontRanges) {
        // Add bold font
        NSRange boldFontRange;
        boldFontRange = [boldFontRangeValue rangeValue];
        if (NSMaxRange(boldFontRange) <= length) {
            [_attrStr addAttribute:(NSString*)kCTFontAttributeName
                    value:(id)ctBoldFont range:boldFontRange];
        }
    }

    // Release font
    if (ctFont) {
        CFRelease(ctFont), ctFont = NULL;
    }
    if (ctBoldFont) {
        CFRelease(ctBoldFont), ctBoldFont = NULL;
    }

    ...

太字設定は、まず太字用のCTFontオブジェクトを作る。今回は、システムのボールドフォントからフォント名を取得した。インスタンス変数の_boldFontRangesという配列に太字を設定する範囲を格納している。そこから範囲を取り出して、addAttribute:value:range:メソッドを使って属性を追加している。

続いて、前景色のための実装。

    ...

    //
    // Set foreground color attribute
    //

    // Set normal body forgrond color
    UIColor*    bodyForegroundColor;
    if (self.highlighted) {
        bodyForegroundColor = self.highlightedTextColor;
    }
    else {
        bodyForegroundColor = self.textColor;
    }
    [_attrStr addAttribute:(NSString*)kCTForegroundColorAttributeName
            value:(id)bodyForegroundColor.CGColor range:NSMakeRange(0, length)];

    // Get foreground colors
    int i;
    for (i = 0; i < [_foregroundColors count]; i++) {
        // Get foreground color and range
        UIColor*    foregroundColor;
        NSRange     foregroundColorRange;
        foregroundColor = [_foregroundColors objectAtIndex:i];
        foregroundColorRange = [[_foregroundColorRanges objectAtIndex:i] rangeValue];

        // Add foreground color attribute
        if (NSMaxRange(foregroundColorRange) <= length) {
            [_attrStr addAttribute:(NSString*)kCTForegroundColorAttributeName
                    value:(id)foregroundColor.CGColor range:foregroundColorRange];
        }
    }

    ...

基本的な流れは、フォントの設定のときと同じだ。色の属性は、CGColorオブジェクトとして設定することに注意。

新たに追加されたメソッドは、次のように呼び出す。

    // Set text
    _attrLabel.text = @"これは太字や色付き文字が表示できるラベルです。";

    // Add attributes
    [_attrLabel addBoldFontAttrWithRange:NSMakeRange(3, 2)];
    [_attrLabel addForegroundColorAttrWithColor:[UIColor blueColor]
            range:NSMakeRange(6, 5)];

で、実行結果がこれ。

確かに属性付き文字列が表示された!これで便利なラベルの出来上がり。

ここまでのソースコード:AttrLabel-2.zip

  1. コメントはまだありません。

  1. 2011年 9月8日
  2. 2011年 12月11日
    トラックバック先 :iOS開発備忘録 | source lab. note