2

UITextViewと一緒にを使用して、iOS用のリッチテキストエディタに取り組んでいますNSAttributedString。従来の機能と同様に機能します(つまり、領域を選択してボタンをクリックすると、その効果がその領域に適用され、テキストの他の属性は保持されます。

残念ながらNSAttributedString、すべてを個別に調整できるわけではありません。それらのいくつか(少なくとも太字、フォント面、およびフォントサイズ)はすべて、を渡す必要がありUIFontます。これにより、リージョンのすべての属性が設定されます(1つだけ設定したい場合でも)。単一の領域に複数の面とサイズが含まれている可能性があるため、これにより、多くの既存のフォーマットを壊す素朴なアプローチになります。

これを達成するための推奨される手段はありますか?私の唯一の選択肢は、適用する領域の属性を繰り返し処理し、他の同じフォント属性を持つチャンクにグループ化してから、各チャンクに個別に適用することだと思います。

4

2 に答える 2

7

あなたは正しい考えを持っており、アルゴリズムはすでにによって提供されていますenumerateAttribute:inRange:options:usingBlock:。これを使用してフォントの実行を処理するには:

[myAttributedString enumerateAttribute:NSFontAttributeName
                               inRange:selectedRange
                               options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
                            usingBlock:addBoldBlock
]

ここで、addBoldBlockは、現在のフォント(ブロックの最初の引数として提供)を取得し、太字を追加して、現在のチャンク(ブロックの2番目の引数として提供)に適用します。

于 2013-01-04T17:54:43.440 に答える
1

これは、DTRichTextEditorで使用するものです。

- (void)toggleBoldInRange:(NSRange)range
{
    // first character determines current boldness
    NSDictionary *currentAttributes = [self typingAttributesForRange:range];

    if (!currentAttributes)
    {
        return;
    }

    [self beginEditing];

    CTFontRef currentFont = (__bridge CTFontRef)[currentAttributes objectForKey:(id)kCTFontAttributeName];
    DTCoreTextFontDescriptor *typingFontDescriptor = [DTCoreTextFontDescriptor fontDescriptorForCTFont:currentFont];

    // need to replace name with family
    CFStringRef family = CTFontCopyFamilyName(currentFont);
    typingFontDescriptor.fontFamily = (__bridge NSString *)family;
    CFRelease(family);

    typingFontDescriptor.fontName = nil;

    NSRange attrRange;
    NSUInteger index=range.location;

    while (index < NSMaxRange(range)) 
    {
        NSMutableDictionary *attrs = [[self attributesAtIndex:index effectiveRange:&attrRange] mutableCopy];
        CTFontRef currentFont = (__bridge CTFontRef)[attrs objectForKey:(id)kCTFontAttributeName];

        if (currentFont)
        {
            DTCoreTextFontDescriptor *desc = [DTCoreTextFontDescriptor fontDescriptorForCTFont:currentFont];

            // need to replace name with family
            CFStringRef family = CTFontCopyFamilyName(currentFont);
            desc.fontFamily = (__bridge NSString *)family;
            CFRelease(family);

            desc.fontName = nil;

            desc.boldTrait = !typingFontDescriptor.boldTrait;
            CTFontRef newFont = [desc newMatchingFont];
            [attrs setObject:(__bridge id)newFont forKey:(id)kCTFontAttributeName];
            CFRelease(newFont);

            if (attrRange.location < range.location)
            {
                attrRange.length -= (range.location - attrRange.location);
                attrRange.location = range.location;
            }

            if (NSMaxRange(attrRange)>NSMaxRange(range))
            {
                attrRange.length = NSMaxRange(range) - attrRange.location;
            }

            [self setAttributes:attrs range:attrRange];
        }

        index += attrRange.length;
    }

    [self endEditing];
}

これは、オープンソースのDTCoreTextプロジェクトのDTCoreTextFontDescriptorを使用します。

PS:それに応じてUIFontで使用するために調整する必要があります。

于 2013-01-05T16:07:14.927 に答える