最近老大给个小任务 叫小生实现label中显示各种不同颜色的字,搜遍坛子,楞是没有。在朋友帮助下搞出来了,并且自己研究了一下,现在贴出来分享。
首先继承一个label,要想在一个label中实现各种不同颜色的字,就是重绘。不多说,上代码
//设置颜色属性和字体属性 - (NSAttributedString *)illuminatedString:(NSString *)text font:(UIFont *)AtFont{ int len = [text length]; //创建一个可变的属性字符串 NSMutableAttributedString *mutaString = [[[NSMutableAttributedString alloc] initWithString:text] autorelease]; //改变字符串 从1位 长度为1 这一段的前景色,即字的颜色。 /* [mutaString addAttribute:(NSString *)(kCTForegroundColorAttributeName) value:(id)[UIColor darkGrayColor].CGColor range:NSMakeRange(1, 1)]; */ [mutaString addAttribute:(NSString *)(kCTForegroundColorAttributeName) value:(id)self.stringColor.CGColor range:NSMakeRange(0, len)]; if (self.keywordColor != nil) { for (NSValue *value in list) { // NSValue *value = [list objectAtIndex:i]; NSRange keyRange = [value rangeValue]; [mutaString addAttribute:(NSString *)(kCTForegroundColorAttributeName) value:(id)self.keywordColor.CGColor range:keyRange]; } } //设置部分字段的字体大小与其他的不同 /* CTFontRef ctFont = CTFontCreateWithName((CFStringRef)AtFont.fontName, AtFont.pointSize, NULL); [mutaString addAttribute:(NSString *)(kCTFontAttributeName) value:(id)ctFont range:NSMakeRange(0, 1)];*/ //设置是否使用连字属性,这里设置为0,表示不使用连字属性。标准的英文连字有FI,FL.默认值为1,既是使用标准连字。也就是当搜索到f时候,会把fl当成一个文字。 int nNumType = 0; // float fNum = 3.0; CFNumberRef cfNum = CFNumberCreate(NULL, kCFNumberIntType, &nNumType); // CFNumberRef cfNum2 = CFNumberCreate(NULL, kCFNumberFloatType, &fNum); [mutaString addAttribute:(NSString *)kCTLigatureAttributeName value:(id)cfNum range:NSMakeRange(0, len)]; //空心字 // [mutaString addAttribute:(NSString *)kCTStrokeWidthAttributeName value:(id)cfNum2 range:NSMakeRange(0, len)]; CTFontRef ctFont2 = CTFontCreateWithName((CFStringRef)AtFont.fontName, AtFont.pointSize, NULL); [mutaString addAttribute:(NSString *)(kCTFontAttributeName) value:(id)ctFont2 range:NSMakeRange(0, len)]; // CFRelease(ctFont); CFRelease(ctFont2); return [[mutaString copy] autorelease]; } //重绘Text - (void)drawRect:(CGRect)rect { //获取当前label的上下文以便于之后的绘画,这个是一个离屏。 CGContextRef context = UIGraphicsGetCurrentContext(); //压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存 //保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕。 CGContextSaveGState(context); //x,y轴方向移动 CGContextTranslateCTM(context, 0.0, 0.0);/*self.bounds.size.height*/ //缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度 // CGContextScaleCTM(context, 1, 100); NSArray *fontArray = [UIFont familyNames]; NSString *fontName; if ([fontArray count]) { fontName = [fontArray objectAtIndex:0]; } //创建一个文本行对象,此对象包含一个字符 CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef) [self illuminatedString:self.text font:self.font]); //[UIFont fontWithName:fontName size:60] //设置文字绘画的起点坐标。 CGContextSetTextPosition(context, 0.0, 0.0); /*ceill(self.bounds.size.height/4)*/ //在离屏上绘制line CTLineDraw(line, context); //将离屏上得内容覆盖到屏幕。此处得做法很像windows绘制中的双缓冲。 CGContextRestoreGState(context); CFRelease(line); //CGContextRef myContext = UIGraphicsGetCurrentContext(); //CGContextSaveGState(myContext); //[self MyColoredPatternPainting:myContext rect:self.bounds]; //CGContextRestoreGState(myContext); }
这里是label中实现多种颜色字体等的最主要的部分,注释已经写的比较清楚了。呵呵···
转载:http://www.cocoachina.com/bbs/read.php?tid=69385
相关推荐
label字体的多变.渐变字体颜色,多彩的渐变字体
一个label上的字体显示不同的颜色(博博~小白)
解决Delphi Xe2应用皮肤后Label字体颜色无法改变问题,增加DisableTheme属性可以设置是否禁用皮肤功能
主要给大家介绍了关于在iOS中Label实现显示不同颜色与字体的相关资料,文中分别介绍了利用range或者文字两种实现的方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
WinUI的Label控件文字显示主要依靠控件皮肤的文字层 她支持以下特性: 1 此文字层支持透明度设置 2 支持文字的颜色任意设置 3 支持Freetype书写 4 同事也支持多国语言的切换功能 5 对齐方式的任意改变 6 文字的...
UILabel的text设置不同颜色、字体
这是一个扩展UILabel 显示效果的代码 主要功能就是可以根据需求让UIlabel 显示不同颜色或字体的字 通过判断可以让你想要的一段话或一个字符显示你想要显示的颜色
在VB.Net中, 如何在Picture控件上显示Lable的透明字体
以前做项目需要实现在文本类控件中加入超链接文字段的功能,在网上查了不少资料基本没有找到比较理想的实现方法,最后无奈只好自己实现了...
c# label的内容显示不全,需要设置如下属性即可: 1、将Lable的font属性的字体改成宋体... 您可能感兴趣的文章:效控制C#中label输出文字的长度,自动换行C#利用Label标签控件模拟窗体标题的移动及窗体颜色不断变换效果
C#135使Label控件显示出多行文字 源代码
这是一个类,相当于把label重写了,这样label然后就多了一个属性,调节属性就可以调节行距了
可以对指定的字符进行变色显示的自定义Label控件。Delphi 2010开发,不支持xp及以下系统
WPF文本控件Label文字竖排及字间距控制。
可以修改一连串字串中某几个字符的颜色,非常好用,大家可以试试
字体镶边的Label控件,会让你的label控件更完美。
自定义Label,可以设置label每行的高度,设置字体大小,可以获取label的size和行数,可以设置label的每行字下面加一条横线(实现类似日记的效果),简单封装,满足自用。
flex button的label字体垂直显示,这个是一个完整的事例,网上有部分代码,但是都不全
vb.net 如何让label中的文字旋转90°显示 C#也是类似的做法(如果需要C#的例子,请在ask.csdn,net提问) https://ask.csdn.net/questions/757416