时间 2014-03-31 21:18:28  CSDN博客原文  http://blog.csdn.net/u011439689/article/details/22693679
首先导入CoreText.framework,并在需要使用的文件中导入:  
#import<CoreText/CoreText.h>  
新建一个类,继承UILabel,以下为文件内容:

MyLabel.h

//MyLabel.h
#import <Foundation/Foundation.h>
#import <CoreText/CoreText.h>@interface MyLabel : UILabel@end

MyLabel.m

//MyLabel.m
#import "MyLabel.h"@implementation MyLabel//NSAttributedString继承于NSObject,并且不支持任何draw的方法,那我们就只能自己draw了。
-(void)drawRect:(CGRect)rect{[super drawRect:rect];NSAttributedString *attriString = [self getAttributedString];//在代码中我们调整了CTM(current transformation matrix),这是因为Quartz 2D的坐标系统不同CGContextRef ctx = UIGraphicsGetCurrentContext();CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));//CTFramesetter是CTFrame的创建工厂,NSAttributedString需要通过CTFrame绘制到界面上,得到CTFramesetter后,创建path(绘制路径),然后得到CTFrame,最后通过CTFrameDraw方法绘制到界面上。CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((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);/*
  //------------------------------------------------------------------------
  //----------------取消注释,同样可以实现UILabel上展示不同样式的文字--------------
  //------------------------------------------------------------------------
  CATextLayer *textLayer = [CATextLayer layer];
  textLayer.string = [self getAttributedString];
  textLayer.frame = CGRectMake(0, 50, 200, 200);//可调整位置
  textLayer.backgroundColor = [UIColor purpleColor].CGColor;
  [self.layer addSublayer:textLayer];
  */
}-(NSMutableAttributedString *)getAttributedString{//创建一个NSMutableAttributedStringNSMutableAttributedString *attriString = [[[NSMutableAttributedString alloc] initWithString:@"Come on,baby!Come on,baby!Come on,baby!"]autorelease];//把this的字体颜色变为红色[attriString addAttribute:(NSString *)kCTForegroundColorAttributeName
            value:(id)[UIColor redColor].CGColor
            range:NSMakeRange(0, 4)];//把is变为黄色[attriString addAttribute:(NSString *)kCTForegroundColorAttributeName
            value:(id)[UIColor yellowColor].CGColor
            range:NSMakeRange(5, 16)];//改变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 *)kCTUnderlineStyleAttributeName
            value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble]
            range:NSMakeRange(0, 4)];/*
  换行的实现

  如果想要计算NSAttributedString所要的size,就需要用到这个API:
  CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行时会算不准的,因为在CoreText里,行间距也是你来控制的。
  设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttributeName,这个属性里面又分为很多子
  属性,其中就包括
  kCTLineBreakByCharWrapping
  kCTParagraphStyleSpecifierLineSpacingAdjustment
  设置如下:*//*
  //-------------取消注释,实现换行-------------

  CTParagraphStyleSetting lineBreakMode;
  CTLineBreakMode lineBreak = kCTLineBreakByCharWrapping; //换行模式
  lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;
  lineBreakMode.value = &lineBreak;
  lineBreakMode.valueSize = sizeof(CTLineBreakMode);
  //行间距
  CTParagraphStyleSetting LineSpacing;
  CGFloat spacing = 4.0;  //指定间距
  LineSpacing.spec = kCTParagraphStyleSpecifierLineSpacingAdjustment;
  LineSpacing.value = &spacing;
  LineSpacing.valueSize = sizeof(CGFloat);

  CTParagraphStyleSetting settings[] = {lineBreakMode,LineSpacing};
  CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, 2);   //第二个参数为settings的长度
  [attriString addAttribute:(NSString *)kCTParagraphStyleAttributeName
  value:(id)paragraphStyle
  range:NSMakeRange(0, attriString.length)];
  */return attriString;
}@end

测试代码

先要 #import "MyView.h",在适当位置创建MyLabel的对象,并添加到View中

MyLabel *myLabel = [[MyLabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.view addSubview:myLabel];
[myLabel release];

效果图如下:

UILabel上展示不同颜色的文字(NSAttributedString)相关推荐

  1. 显示文字_在 iPhone 上调整显示与文字大小,让眼睛更舒服

    刚开始写这个系列文章的时候,不少朋友都建议我,如果要给中老年人看,字号一定要大大大.其实比较最初的文章,我们的确调整过字号的大小,不过终究还是定在了目前的正文 17 号字上. 从某种角度而言,我们也希 ...

  2. php上传多张图片为什么只显示一张,javascript,_js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次???,javascript - phpStudy...

    js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次??? js多张图片上传 也拿到多张图片的路径 在页面上展示只显示一张?只执行了一次??? self.$els.upload ...

  3. iphone原彩显示对眼睛好吗_在 iPhone 上调整显示与文字大小,让眼睛更舒服

    刚开始写这个专栏的时候,不少朋友都建议我,如果要给中老年人看,字号一定要大大大.其实比较最初的文章,我们的确调整过字号的大小,不过终究还是定在了目前的正文 17 号字上. 从某种角度而言,我们也希望文 ...

  4. 计算机在食品上的应用论文,文字设计在食品包装设计中的运用论文

    文字设计在食品包装设计中的运用论文 一.食品包装设计中的文字设计功能及类型 (一)食品包装设计中文字设计的主要功能 食品包装设计中的文字一般主要包括以下两种功能:①可读性.可读性是文字的基本功能,是一 ...

  5. 移动端之在不同尺寸大小的手机上展示同一效果解决方案(修正二) by FungLeo

    移动端之在不同尺寸大小的手机上展示同一效果解决方案 by FungLeo 前言,反思 在之前的项目当中,我在CSS中设置html{font-size: 62.5%;},也就是设置为10px,然后全站根 ...

  6. vue3.0 + typescript openlayers实现地图标点、移动、画线、显示范围、测量长度、测量面积、画三角形、画正方形、画圆、线选、画笔、清除测量、清除、地图上展示弹窗等功能

    vue3.0 + typescript openlayers实现地图标点.移动.画线.显示范围.测量长度.测量面积.画三角形.画正方形.画圆.线选.画笔.清除测量.清除地图所有等功能 由于最近项目中用 ...

  7. Android 在同一个TextView中展示不同颜色、不同字体大小

    同一个TextView中展示不同颜色 xml代码片段 <androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/tang ...

  8. 帆船结构3D线上展示教学的亮点有哪些?

    由广州华锐互动开发的帆船结构3D线上展示教学系统,是一种创新的教学方式,基于虚拟现实技术,通过3D模型.交互式模拟等技术手段,可以让学生在虚拟环境中进行帆船组装和调试训练,以达到实践教学的目的. 不同 ...

  9. php图片写入带问号_php实现图片上传时添加文字和图片水印技巧

    本文实现的功能特别适用于一些商城和图片站中,分享了图片在上传时添加文字和图片水印的技巧,供大家参考,具体内容如下 1. water.class.php header('Content-Type:tex ...

最新文章

  1. linux文字模式怎么传文件夹,虚拟机VMWare文本模式Linux 与 Windows 文件互传
  2. CSU 1779: 错误的算法【矩阵/模拟】
  3. 克制懒惰之飞鸽传书版
  4. 微软开始测试自己的Google Base
  5. softmax实现多分类算法推导及代码实现
  6. 车架号查车辆型号_【菜鸟二手车大讲堂】第十一讲 经常提到的汽车车架号是什么?...
  7. 【程序员面试宝典】第五章 程序设计基本概念
  8. Macro版Property Generator辅助工具
  9. 常见的一些反爬虫策略破解方式-Java网络爬虫系统性学习与实战系列(11)
  10. 手工修复Win 7下彩影ARP防火墙驱动程序(适用于32/64位系统)
  11. 2017年NBA球员数据分析
  12. 【05】制作第一个zblog模板第四期,完成首页logo、搜索、文章列表,友情链接等大部分首页自定义模块
  13. 等待页面所有图片加载完毕
  14. cms三次标记浮动垃圾是如何产生的
  15. java 各种编码间转换
  16. linux内核版本指什么意思,Linux的内核版本是怎么回事
  17. 使用FFMPEG库封装264视频和acc音频数据到MP4文件中
  18. Java中如何实现数组反转,将数组元素倒过来排列?【含详细解析】
  19. python足球大数据分析_Python 抓取欧洲足球联赛数据进行大数据分析
  20. XMLHttpRequest状态

热门文章

  1. html实现旅游网站代码_[资源推荐] 必须收藏的两个查找论文和代码实现的网站!...
  2. mysql远程访问显示警告信息_mysql远程访问的时候遇到了各种问题
  3. 三十八、练习、Python判断一个信用卡号是否合理
  4. 6.29 Vue 第二天 学习笔记
  5. 享学金三银四一线大厂面试专题学习笔记
  6. 直播预告 | TCCI追问研讨会第二期:双向脑机接口如何实现?
  7. 直播 | KDD 2021论文解读:基于协同对比学习的自监督异质图神经网络
  8. 正经炼丹师如何完美安排国庆长假?| 假期专属论文清单
  9. 立足前沿 直击热点 搭建平台,2018中国人工智能大会在深圳拉开帷幕
  10. HDU1584 蜘蛛牌 DFS回溯