1

インスタンス var として 1 つの文字列があり、それを 2 つの異なるフォントで部分的に描画したいと考えています。具体的には、 xyz( abc )と読みます。

例: 'xyz()' 部分を通常のフォントで、' abc ' をイタリック体で描画したい。

この文字列はプロパティであり、ビューは一般的です。特定の場合にのみ、このような文字列を表示する必要があります。

NSAttributedString とその Mutable バージョンを試しましたが、iOS では完全にはサポートされていないようです。

属性のキーを取得できませんでした。どうすればよいですか?

ここで NSAttributedString を使用する方法はありますか?

4

3 に答える 3

1

UIView をサブクラス化して、コア テキストを使用して描画し、カスタマイズされた NSAttributed 文字列を渡します。

私の頭の上から次のようなもの:

CustomLabel.h
#import <CoreText/CoreText.h>

@interface CustomLabel : UIView
@property NSAttributedString *attributedText;
@end

CustomLabel.m

@interface SMAttributedTextView ()
{
    @protected
    CTFramesetterRef _framesetter;
}

@implementation SMAttributedTextView

@synthesize attributedString = _attributedString;
    //need dealloc even with ARC method to release framesetter if it still exists
- (void)dealloc{
    if (_framesetter) CFRelease(_framesetter);
}

- (void)setAttributedString:(NSAttributedString *)aString
{
    _attributedString = aString;
    [self setNeedsDisplay];//force redraw
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    //Context Drawing Setup
    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    CGContextTranslateCTM(context, 0, self.frame.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetShouldSubpixelPositionFonts(context, YES);
    CGContextSetShouldSubpixelQuantizeFonts(context, YES);
    CGContextSetShouldAntialias(context, YES);

    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, rect);

    CTFramesetterRef framesetter = [self framesetter];
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [_attributedText length]), path, NULL);
    CTFrameDraw(frame, context);
    CFRelease(frame);
    CFRelease(path);

    UIGraphicsPushContext(context);
}

@end

したがって、これ以外では、属性付き文字列のセッターを呼び出し、再描画する必要があります。ビューに送信する前に、NSAttributd 文字列の範囲にカスタム特性を適用することもできます。正規表現または一般的な文字列検索を使用して見つけることができます。

すなわち

NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:@"xyz(abc)"];
NSRange rangeOfABC = NSMakeRange(4,3);
//make style dictionary **see core text docs - I can't remeber off the top of my head sorry
[aString addAttributes:newAttrs range:rangeOfABC];

[customlabel setAttributedString:aString];

コードに関しては少し異なる可能性があります-私の非作業マシンでは申し訳ありませんが、100%検証できません。

また、メモリから、これは、属性付き文字列の現在のフォントに斜体の特性を適用する方法です

NSString *targetString = @"xyc(abc)";
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:targetString];
NSRange entireRange = NSMakeRange(0, (targetString.length -1));
NSDictionary *attDict = [attString attributesAtIndex:entireRange.location effectiveRange:&entireRange];
CTFontRef curFontRef = (__bridge CTFontRef)[attDict objectForKey:@"NSFont"];
CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(curFontRef);
BOOL isItalic = ((traits & kCTFontItalicTrait) == kCTFontItalicTrait);

NSMutableDictionary *newAttrs = [NSMutableDictionary dictionary];
CTFontRef italicRef = CTFontCreateCopyWithSymbolicTraits(curFontRef,
                                                         CTFontGetSize(curFontRef),
                                                         NULL,
                                                         kCTFontItalicTrait,
                                                         kCTFontItalicTrait);

if (italicRef)
{
    newAttrs = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)italicRef, kCTFontAttributeName,nil];
    [attString addAttributes:newAttrs range:NSMakeRange(4,3)];//or whatever range you want
    CFRelease(italicRef);
}

それが役に立てば幸い。

于 2012-05-04T14:11:42.417 に答える
0

NSAttributedStringなどを描画するには、独自のコントロールを提供する必要がありますTTTAttributedLabel

于 2012-05-04T13:58:58.347 に答える
0

この効果を得るには、2 つの異なる文字列/ラベルを使用する必要があると思います。私の知る限り、ラベルまたは別の同様の要素だけを使用してそれを行うことはできません。

また、同様の状況で Web ビューを使用し、html/css を使用して 1 つのテキストの一部を異なるスタイルで表示しました。

于 2012-05-04T13:49:28.640 に答える