【我就看看不说话】NSAttributedString
来源:互联网 发布:iphone7虚拟定位软件 编辑:程序博客网 时间:2024/04/19 02:11
NSAttributedString 详解
(2012-08-01 17:44:56)杂谈
分类: iPhone开发首先导入CoreText.framework,并在需要使用的文件中导入:
#import<CoreText/CoreText.h>
创建一个NSMutableAttributedStrin
- NSMutableAttributedStrin
g "this*attriString = [[[NSMutableAttributedStrin g alloc] initWithString:@ is ]test!" -
autorelease];
- //把this的字体颜色变为红色
- [attriString
addAttribute:(NSString *)kCTForegroundColorAttrib uteName -
value:(id)[UIColor redColor].CGColor -
range:NSMakeRange(0, 4)]; - //把is变为黄色
- [attriString
addAttribute:(NSString *)kCTForegroundColorAttrib uteName -
value:(id)[UIColor yellowColor].CGColor -
range:NSMakeRange(5, 2)]; - //改变this的字体,value必须是一个CTFontRef
- [attriString
addAttribute:(NSString *)kCTFontAttributeName -
value:(id)CTFontCreateWithName((CFStringRef)[UIFont boldSystemFontOfSize:14].fontName, -
14, -
NULL) -
range:NSMakeRange(0, 4)]; - //给this加上下划线,value可以在指定的枚举中选择
- [attriString
addAttribute:(NSString *)kCTUnderlineStyleAttribu teName -
value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] -
range:NSMakeRange(0, 4)]; - return
attriString;
这样就算是配置好了,但是我们可以发现NSAttributedString继承于NSObject,并且不支持任何draw的方法,那我们就只能自己draw了。写一个UIView的子类(假设命名为TView),在initWithFrame中把背景色设为透明(self.backgroundColor = [UIColor clearColor]),然后在重写drawRect方法:
- -(void)drawRect:(CGRect)rect{
-
[super drawRect:rect]; -
-
NSAttributedString *attriString = getAttributedString(); -
-
CGContextRef ctx = UIGraphicsGetCurrentCont ext(); -
CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTra nslation(0, rect.size.height), 1.f, -1.f)); -
-
CTFramesetterRef framesetter = CTFramesetterCreateWithA ttributedString((CFAttributedStringRef)attriString); -
CGMutablePathRef path = CGPathCreateMutable(); -
CGPathAddRect(path, NULL, rect); -
-
CTFrameRef frame = CTFramesetterCreateFrame (framesetter, CFRangeMake(0, 0), path, NULL); -
CFRelease(path); -
CFRelease(framesetter); -
-
CTFrameDraw(frame, ctx); -
CFRelease(frame); - }
在代码中我们调整了CTM(current transformation matrix),这是因为Quartz 2D的坐标系统不同,比如(10, 10)到(20, 20)的直线坐标:
坐标类似于数学中的坐标,可以先不调整CTM,看它是什么样子的,下面两种调整方法是完全一样的:
- CGContextConcatCTM(ctx,
CGAffineTransformScale(CGAffineTransformMakeTra nslation(0, rect.size.height), 1.f, -1.f));
- CGContextTranslateCTM(ctx,
0, rect.size.height); - CGContextScaleCTM(ctx,
1, -1);
CTFramesetter是CTFrame的创建工厂,NSAttributedString需要通过CTFrame绘制到界面上,得到CTFramesetter后,创建path(绘制路径),然后得到CTFrame,最后通过CTFrameDraw方法绘制到界面上。
如果想要计算NSAttributedString所要的size,就需要用到这个API:
CTFramesetterSuggestFram
设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttribu
属性,其中就包括
- kCTLineBreakByCharWrappi
ng - kCTParagraphStyleSpecifi
erLineSpacingAdjustment
- //段落
-
//line break - CTParagraphStyleSetting
lineBreakMode; - CTLineBreakMode
lineBreak = kCTLineBreakByCharWrappi ng; //换行模式 - lineBreakMode.spec
= kCTParagraphStyleSpecifi erLineBreakMode; - lineBreakMode.value
= &lineBreak; - lineBreakMode.valueSize
= sizeof(CTLineBreakMode); -
//行间距 - CTParagraphStyleSetting
LineSpacing; - CGFloat
spacing = 4.0; //指定间距 - LineSpacing.spec
= kCTParagraphStyleSpecifi erLineSpacingAdjustment; - LineSpacing.value
= &spacing; - LineSpacing.valueSize
= sizeof(CGFloat); -
- CTParagraphStyleSetting
settings[] = {lineBreakMode,LineSpacing}; - CTParagraphStyleRef
paragraphStyle = CTParagraphStyleCreate(settings, 2); //第二个参数为settings的长度 - [attributedString
addAttribute:(NSString *)kCTParagraphStyleAttribu teName -
value:(id)paragraphStyle -
range:NSMakeRange(0, attributedString.length)];
-----------------------------------------猥琐的分界线-----------------------------------------
这并不是唯一的方法,还有另一种替代方案:
- CATextLayer
*textLayer = [CATextLayer layer]; - textLayer.string
= getAttributedString(); - textLayer.frame
= CGRectMake(0, CGRectGetMaxY(view.frame), 200, 200); - [self.view.layer
addSublayer:textLayer];
-----------------------------------------猥琐的分界线-----------------------------------------
效果图:
源码地址
- 【我就看看不说话】NSAttributedString
- 【我就看看不说话】UIActivity
- 【我就看看不说话】 UIActionSheet
- 【我就看看不说话】UIAlertView
- 【我就看看不说话】UIAppearance
- 【我就看看不说话】UITextField
- 【我就看看不说话】 svn
- 【我就看看不说话】常用函数
- 【我就看看不说话】读取通讯录
- 【我就看看不说话】Block 使用
- 【我就看看不说话】NSDate 日期
- 【我就看看不说话】nsstring 使用
- 【我就看看不说话】xcode 快捷键
- 【我就看看不说话】有用网站
- 【我就看看不说话】ios 指南
- 【我就看看不说话】自动布局
- 【我就看看不说话】UITextView NSTextContainer NSLayoutManager NSTextStorage
- 【我就看看不说话】证书的制作
- 浅析Java中的final关键字
- Android学习 - ContentObserver监听
- 算法导论笔记:09中位数和顺序统计量
- LeetCode
- Linux内核--网络栈实现分析(一)--网络栈初始化--转
- 【我就看看不说话】NSAttributedString
- music 选择器
- 外国人自制真空三极管
- 二项随机变量
- 将SQLite移植到ARM板上
- 《剑指Offer》面试题9:裴波那契数列
- android Android SystemProperties设置/取得系统属性的用法总结
- 【linux kernel】 softirq 软中断讨论
- 如何给自己的程序添加BugReport