UILabel上展示不同颜色的文字(NSAttributedString)

2024-06-08 10:32

本文主要是介绍UILabel上展示不同颜色的文字(NSAttributedString),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【提示:最好的方法在最后哦!O(∩_∩)O~】

首先导入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 *)kCTForegroundColorAttributeNamevalue:(id)[UIColor redColor].CGColorrange:NSMakeRange(0, 4)];//把is变为黄色[attriString addAttribute:(NSString *)kCTForegroundColorAttributeNamevalue:(id)[UIColor yellowColor].CGColorrange:NSMakeRange(5, 16)];//改变this的字体,value必须是一个CTFontRef[attriString addAttribute:(NSString *)kCTFontAttributeNamevalue:(id)CTFontCreateWithName((CFStringRef)[UIFont boldSystemFontOfSize:14].fontName,14,NULL)range:NSMakeRange(0, 4)];//给this加上下划线,value可以在指定的枚举中选择[attriString addAttribute:(NSString *)kCTUnderlineStyleAttributeNamevalue:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble]range:NSMakeRange(0, 4)];/*换行的实现如果想要计算NSAttributedString所要的size,就需要用到这个API:CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行时会算不准的,因为在CoreText里,行间距也是你来控制的。设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttributeName,这个属性里面又分为很多子属性,其中就包括kCTLineBreakByCharWrappingkCTParagraphStyleSpecifierLineSpacingAdjustment设置如下:*//*//-------------取消注释,实现换行-------------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 *)kCTParagraphStyleAttributeNamevalue:(id)paragraphStylerange: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];

效果图如下:




补充:另一种方式,利用NSMutableAttributedString,很简便

//iOS6以后 在UILabel显示不同的字体和颜色
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Using NSAttributed String"];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0,5)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(6,12)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(19,6)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Arial-BoldItalicMT" size:30.0] range:NSMakeRange(0, 5)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:10.0] range:NSMakeRange(6, 12)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Courier-BoldOblique" size:30.0] range:NSMakeRange(19, 6)];
self.attrLabel.attributedText = str;



这篇关于UILabel上展示不同颜色的文字(NSAttributedString)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041926

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx