11

ラベルに派手なテキストを追加しようとしていますが、NSMutableAttributedString クラスで問題が発生しました。私はこれを4つ達成しようとしていました.1.フォントの変更、2.下線の範囲、3.範囲の色の変更、4.上付き範囲。

このコード:

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
    NSMutableAttributedString* display = [[NSMutableAttributedString alloc]
                                          initWithString:@"Hello world!"];
    NSUInteger length = [[display string]length] - 1;

    NSRange wholeRange = NSMakeRange(0, length);
    NSRange helloRange = NSMakeRange(0, 4);
    NSRange worldRange = NSMakeRange(6, length);

    NSFont* monoSpaced = [NSFont fontWithName:@"Menlo" 
                                         size:22.0];

    [display addAttribute:NSFontAttributeName
                    value:monoSpaced
                    range:wholeRange];

    [display addAttribute:NSUnderlineStyleAttributeName 
                    value:[NSNumber numberWithInt:1] 
                    range:helloRange];

    [display addAttribute:NSForegroundColorAttributeName 
                    value:[NSColor greenColor]
                    range:helloRange];

    [display addAttribute:NSSuperscriptAttributeName 
                    value:[NSNumber numberWithInt:1] 
                    range:worldRange];

    //@synthesize textLabel; is in this file.
    [textLabel setAttributedStringValue:display];
}

このエラーが表示されます:

NSMutableRLEArray objectAtIndex:effectiveRange:: Out of bounds

また、範囲をいじってみましたが、試してみるとさらに混乱しましたNSRange worldRange = NSMakeRange(4, 5);。なぜこれが生成されるのかわかりません: Hell^o wor^ld!、ここで ^s 内の文字は上付き文字です。

NSRange worldRange = NSMakeRange(6, 6);目的の効果を生み出しますhello ^world!^

ラベルの外観:
出力テキスト

4

2 に答える 2

43

worldRange での長さが長すぎます。NSMakeRange は、開始点と終了点ではなく、開始点と長さの 2 つの引数を取ります。それがおそらく、両方の問題について混乱している理由です。

于 2012-07-20T02:42:38.997 に答える
5

NSRange開始インデックスと範囲の長さの 2 つの値があります。

したがって、インデックス 6 から開始し、lengthその後に文字列を移動する場合は、文字列の末尾を過ぎます。必要なものは次のとおりです。

NSRange worldRange = NSMakeRange(6, length - 6);
于 2012-07-20T02:41:01.880 に答える