NSMutableAttributedString的使用

来源:互联网 发布:nba常规赛球队数据 编辑:程序博客网 时间:2024/04/30 12:14
在项目中要时UIlabel中显示不同字体大小的字符串,刚开始使用的是uilabel控键,但后来发现要使用NSMutableAttributedString,还没有接触过者种类型的字符串于是就学一下:
在IOS6之前需要使用NSMutableAttributedString时都需要导入:CoreText.framework框架的,但在IOS6 之后就不在需要了,其实它的创建很简单:
NSMutableAttributedString *attriString = [[NSMutableAttributedString alloc] initWithString:@"this is test!"] 
这样就创建了一个NSMutableAttributedString对象下面是对他的一些简单操作:
//把this的字体颜色变为红色 
[attriString addAttribute:(NSString *)kCTForegroundColorAttributeName 
value:[UIColor redColor].CGColor 
range:NSMakeRange(0, 4)]; 
//把is变为黄色 
[attriString addAttribute:(NSString *)kCTForegroundColorAttributeName 
value:[UIColor yellowColor].CGColor 
range:NSMakeRange(5, 2)]; 
//改变this的字体,把this改变成20号字体
[attriString addAttribute:(NSString *)kCTFontAttributeName 
value: [UIFont fontWithName:@"Arial" size:20]
range:NSMakeRange(0, 4)]; 
//给this加上下划线,value可以在指定的枚举中选择 
[attriString addAttribute:(NSString *)kCTUnderlineStyleAttributeName 
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 = UIGraphicsGetCurrentContext();
CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f)); 
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attriString);//前面定义的NSMutableAttributedString字符串
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(CGAffineTransformMakeTranslation(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:
CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行时会算不准的,因为在CoreText里,行间距也是你来控制的。
设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttributeName,这个属性里面又分为很多子
属性,其中就包括
kCTLineBreakByCharWrapping
kCTParagraphStyleSpecifierLineSpacingAdjustment
设置如下:
这并不是唯一的方法,还有另一种替代方案
CATextLayer *textLayer = [CATextLayer layer]; 
textLayer.string = getAttributedString(); //得到此前实例化的NSAttributedString对象
textLayer.frame = CGRectMake(0, CGRectGetMaxY(view.frame), 200, 200); 
[self.view.layer addSublayer:textLayer];
复制代码
CATextLayer可以直接支持NSNutableAttributedString! CATsxtLayer可以直接代替UIlabel;
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 衣服皱了没有熨斗怎么办 油烟机油盒坏了怎么办 实体店不给换货怎么办 台式电脑鼠标不动了怎么办 电脑开机一直长鸣报警怎么办 国外电话卡网速太慢怎么办 滴滴提现忘记登录密码怎么办 微信提现支付密码忘记了怎么办 小米手机前置摄像头打不开怎么办 mp4视频屏幕好小怎么办 投了简历没回应怎么办 借壳上市原股票怎么办 红米note3指纹解锁失灵怎么办 来分期刷脸失败怎么办 买到假货商家不承认怎么办 买到假货翻新货工商局怎么办 三星note8笔丢了怎么办 夜跑结束后该怎么办 lol客户端正在运行中怎么办 瑞和宝终端锁定怎么办 骊爽摩托车动力弱怎么办? 换了手机跟点微信怎么办 手机送点插头换了怎么办 校园网总是显示有代理软件怎么办 电脑连接无线网络需要登录怎么办 智校园密码忘了怎么办 ivvi手机开不开机怎么办 跑鞋子大了一码怎么办 洗浴搓澡出汗多该怎么办 联华超市卡丢了怎么办 飞利浦电视的应用打不开怎么办 贵阳市下岗职工办理门面补贴怎么办 陌陌上被骗了色怎么办 七位数的座机要怎么办 开通米粉卡店铺预留电话号码怎么办 办信用卡没有单位电话怎么办 qq账号永久封停怎么办 qq号给冻结了怎么办 微信被官方封2天怎么办 天虹的卡丢了怎么办 顺丰快递到不了的地区怎么办