我有一个字符串作为实例var,我想用两种不同的字体部分绘制它。 具体来说,它是:xyz( abc )。
ie:我想用普通字体绘制'xyz()'部分,用斜体绘制' abc '。
此字符串是属性,视图是通用的。仅在特定情况下它应该显示这样的字符串。
我尝试了NSAttributedString及其Mutable版本,但似乎在iOS上并不完全支持。
无法获取属性的键,我应该怎么做?
有没有在这里使用NSAttributedString?
答案 0 :(得分: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
所以除此之外你会调用setter来获取属性字符串,它应该重绘。 在将NSAttributd字符串发送到视图之前,您还可以将自定义特征应用于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);
}
希望它有所帮助。
答案 1 :(得分:0)
我认为您需要使用两个不同的字符串/标签来实现此效果。 据我所知,仅仅使用标签或其他类似元素是不可能的。
我也在类似情况下使用了网页浏览,并使用html / css显示不同风格的一个文本的部分内容。
答案 2 :(得分:0)
您必须提供自己的控件来绘制NSAttributedString
,例如TTTAttributedLabel
。