美文网首页
NSAttributedString的设置

NSAttributedString的设置

作者: 隔壁班小明 | 来源:发表于2016-03-01 16:37 被阅读834次

/*将符号转换为上标*/

-(NSMutableAttributedString *)changeToSuperscriptForNumberSignWith:(NSString *)string changeString:(NSString *)changeString{

NSRange range = [string rangeOfString:changeString];

NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc]initWithString:string];

NSDictionary * attris = @{NSBaselineOffsetAttributeName:@(3),

NSFontAttributeName:[UIFont systemFontOfSize:9]};

[attributedString setAttributes:attris range:range];

return attributedString;

}

NSAttributedString可以让我们使一个字符串显示的多样化,但是目前到iOS 5为止,好像对它支持的不是很好,因为显示起来不太方便(至少没有在OS X上方便)。

首先导入CoreText.framework,并在需要使用的文件中导入:

#import

创建一个NSMutableAttributedString:

1NSMutableAttributedString*attriString = [[[NSMutableAttributedStringalloc]initWithString:@"this is test!"]

2autorelease];

非常常规的创建方式,接下来我们给它配置属性:

1//把this的字体颜色变为红色

2[attriStringaddAttribute:(NSString*)kCTForegroundColorAttributeName

3value:(id)[UIColorredColor].CGColor

4range:NSMakeRange(0, 4)];

5//把is变为黄色

6[attriStringaddAttribute:(NSString*)kCTForegroundColorAttributeName

7value:(id)[UIColoryellowColor].CGColor

8range:NSMakeRange(5, 2)];

9//改变this的字体,value必须是一个CTFontRef

10[attriStringaddAttribute:(NSString*)kCTFontAttributeName

11value:(id)CTFontCreateWithName((CFStringRef)[UIFontboldSystemFontOfSize:14].fontName,

1214,

13NULL)

14range:NSMakeRange(0, 4)];

15//给this加上下划线,value可以在指定的枚举中选择

16[attriStringaddAttribute:(NSString*)kCTUnderlineStyleAttributeName

17value:(id)[NSNumbernumberWithInt:kCTUnderlineStyleDouble]

18range:NSMakeRange(0, 4)];

19returnattriString;

这样就算是配置好了,但是我们可以发现NSAttributedString继承于NSObject,并且不支持任何draw的方法,那我们就只能自己draw了。写一个UIView的子类(假设命名为TView),在initWithFrame中把背景色设为透明(self.backgroundColor = [UIColor clearColor]),然后在重写drawRect方法:

1-(void)drawRect:(CGRect)rect{

2[superdrawRect:rect];

3

4NSAttributedString*attriString = getAttributedString();

5

6CGContextRef ctx = UIGraphicsGetCurrentContext();

7CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));

8

9CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attriString);

10CGMutablePathRef path = CGPathCreateMutable();

11CGPathAddRect(path,NULL, rect);

12

13CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path,NULL);

14CFRelease(path);

15CFRelease(framesetter);

16

17CTFrameDraw(frame, ctx);

18CFRelease(frame);

19}

在代码中我们调整了CTM(current transformation matrix),这是因为Quartz 2D的坐标系统不同,比如(10, 10)到(20, 20)的直线坐标:

坐标类似于数学中的坐标,可以先不调整CTM,看它是什么样子的,下面两种调整方法是完全一样的:

1CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));

==

1CGContextTranslateCTM(ctx, 0, rect.size.height);

2CGContextScaleCTM(ctx, 1, -1);

CTFramesetter是CTFrame的创建工厂,NSAttributedString需要通过CTFrame绘制到界面上,得到CTFramesetter后,创建path(绘制路径),然后得到CTFrame,最后通过CTFrameDraw方法绘制到界面上。

如果想要计算NSAttributedString所要的size,就需要用到这个API:

CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行时会算不准的,因为在CoreText里,行间距也是你来控制的。

设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttributeName,这个属性里面又分为很多子

属性,其中就包括

• kCTLineBreakByCharWrapping

• kCTParagraphStyleSpecifierLineSpacingAdjustment

设置如下:

1//段落

2//line break

3CTParagraphStyleSetting lineBreakMode;

4CTLineBreakMode lineBreak = kCTLineBreakByCharWrapping;//换行模式

5lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;

6lineBreakMode.value = &lineBreak;

7lineBreakMode.valueSize =sizeof(CTLineBreakMode);

8//行间距

9CTParagraphStyleSetting LineSpacing;

10CGFloat spacing = 4.0;//指定间距

11LineSpacing.spec = kCTParagraphStyleSpecifierLineSpacingAdjustment;

12LineSpacing.value = &spacing;

13LineSpacing.valueSize =sizeof(CGFloat);

14

15CTParagraphStyleSetting settings[] = {lineBreakMode,LineSpacing};

16CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, 2);//第二个参数为settings的长度

17[attributedStringaddAttribute:(NSString*)kCTParagraphStyleAttributeName

18value:(id)paragraphStyle

19range:NSMakeRange(0, attributedString.length)];

-----------------------------------------猥琐的分界线-----------------------------------------

这并不是唯一的方法,还有另一种替代方案:

1CATextLayer*textLayer = [CATextLayerlayer];

2textLayer.string = getAttributedString();

3textLayer.frame = CGRectMake(0, CGRectGetMaxY(view.frame), 200, 200);

4[self.view.layeraddSublayer:textLayer];

CATextLayer可以直接支持NSAttributedString!

-----------------------------------------猥琐的分界线-----------------------------------------

效果图:

文本属性Attributes

1.NSKernAttributeName: @10 调整字句 kerning 字句调整

2.NSFontAttributeName : [UIFont systemFontOfSize:_fontSize] 设置字体

3.NSForegroundColorAttributeName :[UIColor redColor] 设置文字颜色

4.NSParagraphStyleAttributeName : paragraph 设置段落样式

5.NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];

paragraph.alignment = NSTextAlignmentCenter;

6.NSBackgroundColorAttributeName: [UIColor blackColor] 设置背景颜色

7.NSStrokeColorAttributeName设置文字描边颜色,需要和NSStrokeWidthAttributeName设置描边宽度,这样就能使文字空心.

NSStrokeWidthAttributeName这个属性所对应的值是一个 NSNumber 对象(小数)。该值改变描边宽度(相对于字体size 的百分比)。默认为 0,即不改变。正数只改变描边宽度。负数同时改变文字的描边和填充宽度。例如,对于常见的空心字,这个值通常为3.0。

同时设置了空心的两个属性,并且NSStrokeWidthAttributeName属性设置为整数,文字前景色就无效果了

效果:

效果:

8. NSStrikethroughStyleAttributeName 添加删除线,strikethrough删除线

效果:

9. NSUnderlineStyleAttributeName 添加下划线

效果:

10. NSShadowAttributeName 设置阴影,单独设置不好使,必须和其他属性搭配才好使。

和这三个任一个都好使,NSVerticalGlyphFormAttributeName,NSObliquenessAttributeName,NSExpansionAttributeName

11.NSVerticalGlyphFormAttributeName

该属性所对应的值是一个 NSNumber 对象(整数)。0 表示横排文本。1 表示竖排文本。在 iOS 中,总是使用横排文本,0 以外的值都未定义。

效果:

12. NSObliquenessAttributeName设置字体倾斜。Skew 斜

效果:

13. NSExpansionAttributeName 设置文本扁平化

相关文章

网友评论

      本文标题:NSAttributedString的设置

      本文链接:https://www.haomeiwen.com/subject/xbtnkttx.html