iOS5 NSAttributedString

14、iOS里面的富文本 iOS里面的富文本巧用UITextView实现富文本的点击效果 巧用UITextView实现富文本的点击效果 class RegisterController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() //用UItextView 实现富文本的功能 let textView = UITextView(frame: CGRect(x: 阅读详情

NSAttributedString可以让我们使一个字符串显示的多样化,但是目前到iOS 5为止,好像对它支持的不是很好,因为显示起来不太方便(至少没有在OS X上方便)。

首先导入CoreText.framework,并在需要使用的文件中导入:

#import<CoreText/CoreText.h>

创建一个NSMutableAttributedString:

  1. NSMutableAttributedString *attriString = [[[NSMutableAttributedString alloc] initWithString:@"this is test!"]   
  2.                                               autorelease];  
非常常规的创建方式,接下来我们给它配置属性:
  1. //把this的字体颜色变为红色  
  2. [attriString addAttribute:(NSString *)kCTForegroundColorAttributeName  
  3.                     value:(id)[UIColor redColor].CGColor   
  4.                     range:NSMakeRange(0, 4)];  
  5. //把is变为黄色  
  6. [attriString addAttribute:(NSString *)kCTForegroundColorAttributeName  
  7.                     value:(id)[UIColor yellowColor].CGColor   
  8.                     range:NSMakeRange(5, 2)];  
  9. //改变this的字体,value必须是一个CTFontRef  
  10. [attriString addAttribute:(NSString *)kCTFontAttributeName  
  11.                     value:(id)CTFontCreateWithName((CFStringRef)[UIFont boldSystemFontOfSize:14].fontName,  
  12.                                                    14,   
  13.                                                    NULL)  
  14.                     range:NSMakeRange(0, 4)];  
  15. //给this加上下划线,value可以在指定的枚举中选择  
  16. [attriString addAttribute:(NSString *)kCTUnderlineStyleAttributeName  
  17.                     value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble]  
  18.                     range:NSMakeRange(0, 4)];  
  19. return attriString;  

这样就算是配置好了,但是我们可以发现NSAttributedString继承于NSObject,并且不支持任何draw的方法,那我们就只能自己draw了。写一个UIView的子类(假设命名为TView),在initWithFrame中把背景色设为透明(self.backgroundColor = [UIColor clearColor]),然后在重写drawRect方法:

  1. -(void)drawRect:(CGRect)rect{  
  2.     [super drawRect:rect];  
  3.       
  4.     NSAttributedString *attriString = getAttributedString();  
  5.       
  6.     CGContextRef ctx = UIGraphicsGetCurrentContext();  
  7.     CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));  
  8.       
  9.     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attriString);  
  10.     CGMutablePathRef path = CGPathCreateMutable();  
  11.     CGPathAddRect(path, NULL, rect);  
  12.       
  13.     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);  
  14.     CFRelease(path);  
  15.     CFRelease(framesetter);  
  16.       
  17.     CTFrameDraw(frame, ctx);  
  18.     CFRelease(frame);  
  19. }  

在代码中我们调整了CTM(current transformation matrix),这是因为Quartz 2D的坐标系统不同,比如(10, 10)到(20, 20)的直线坐标:

 

坐标类似于数学中的坐标,可以先不调整CTM,看它是什么样子的,下面两种调整方法是完全一样的:

  1. CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));  
==
  1. CGContextTranslateCTM(ctx, 0, rect.size.height);  
  2. CGContextScaleCTM(ctx, 1, -1);  

CTFramesetter是CTFrame的创建工厂,NSAttributedString需要通过CTFrame绘制到界面上,得到CTFramesetter后,创建path(绘制路径),然后得到CTFrame,最后通过CTFrameDraw方法绘制到界面上。

如果想要计算NSAttributedString所要的size,就需要用到这个API:

CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行时会算不准的,因为在CoreText里,行间距也是你来控制的。

设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttributeName,这个属性里面又分为很多子

属性,其中就包括

  • kCTLineBreakByCharWrapping
  • kCTParagraphStyleSpecifierLineSpacingAdjustment
设置如下:

  1. //段落  
  2.     //line break  
  3. CTParagraphStyleSetting lineBreakMode;  
  4. CTLineBreakMode lineBreak = kCTLineBreakByCharWrapping; //换行模式  
  5. lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;  
  6. lineBreakMode.value = &lineBreak;  
  7. lineBreakMode.valueSize = sizeof(CTLineBreakMode);  
  8.     //行间距  
  9. CTParagraphStyleSetting LineSpacing;  
  10. CGFloat spacing = 4.0;  //指定间距  
  11. LineSpacing.spec = kCTParagraphStyleSpecifierLineSpacingAdjustment;  
  12. LineSpacing.value = &spacing;  
  13. LineSpacing.valueSize = sizeof(CGFloat);  
  14.   
  15. CTParagraphStyleSetting settings[] = {lineBreakMode,LineSpacing};  
  16. CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, 2);   //第二个参数为settings的长度  
  17. [attributedString addAttribute:(NSString *)kCTParagraphStyleAttributeName  
  18.                          value:(id)paragraphStyle  
  19.                          range:NSMakeRange(0, attributedString.length)];  

-----------------------------------------猥琐的分界线-----------------------------------------

这并不是唯一的方法,还有另一种替代方案:

  1. CATextLayer *textLayer = [CATextLayer layer];  
  2. textLayer.string = getAttributedString();  
  3. textLayer.frame = CGRectMake(0, CGRectGetMaxY(view.frame), 200, 200);  
  4. [self.view.layer addSublayer:textLayer];  
CATextLayer可以直接支持NSAttributedString!

-----------------------------------------猥琐的分界线-----------------------------------------

效果图:


源码地址

-----------------------------------------猥琐的分界线-----------------------------------------
目前发现有一个问题,好像中文全都会被加粗,设置不加粗的字体也没用,应该是CoreText的bug,已经上报给了apple了。

----------------------------------------- 对于cythb兄提出的问题 -----------------------------------------
首先表示感谢关注
原文中确有描述不适当的地方,比如: The upper-left corner of the context is (0, 0) 。实际上Quartz2D的坐标系统确实在左下角,只是有一些技术在设置它们的graphics context时使用了不同于Quartz的默认坐标系统。相对于Quartz来说,这些坐标系统是修改的坐标系统(modified coordinate system)。
iOS打字机效果实现:轻量、可中断、富文本支持的原生方案 打字机效果是一种将文字以字符级渐进方式呈现的交互技术,其核心原理是通过可控的时序调度模拟‘文字生成过程’,从而降低用户认知负荷、锚定注意力并掩盖异步加载延迟。在iOS平台,该技术已超越视觉动效范畴,成为提升文案亲和力与无障碍体验的关键实践。它依托NSAttributedString实现样式保真,结合GCD Timer保障线程安全与可中断性,并天然适配UILabel、UITextView等原生控件。典型应用场景包括表单校验提示、新手引导、动态API文案及教育类知识卡片。本文聚焦UIKit原生能力,提供无第三方 阅读详情

相关推荐

iOS打字机效果实现:可中断富文本逐字动画方案

打字机效果是一种基于文本逐帧渲染的UI动效技术,其核心原理是通过控制字符串的渐进式赋值节奏,实现信息的有序视觉呈现。该技术依托Core Animation与CATextLayer协同工作,具备毫秒级暂停/恢复能力,并天然支持NSAttributedString富文本渲染,在中英文混排、Emoji、样式嵌套等复杂场景下保持稳定。相比CADisplayLink或GCD定时器方案,它规避了线程安全、属性继承断裂和中断残留等问题,显著提升引导页完成率、配置页阅读率及无障碍(VoiceOver)兼容性。本文聚焦iOS

weixin_31115195的博客 205

图文混排之NSAttributedString(超级详细的富文本大全)

图文混排之NSAttributedString(超级详细的富文本大全)

vkooy的博客 1379

NSAttributedString 的小例子

NSAttributedString的小例子 http://blog.youkuaiyun.com/zhangao0086/article/details/7616385

NSAttributedString

字符属性在Standard Attributes中列举的Standard Attributes如下: 在NSAttributedString描述中,列举的字符属性有:/* 字符属性 字符属性可以应用于 attributed string 的文本中。 NSString *const NSFontAttributeName;(字体) NSString *const NSParagraphStyl

了凡 1984

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 396

Fast DDS源代码走读

DDS, PDP, EPD, DataWriter, DataReader

weixin_43082062的博客 710

富文本

ios项目中经常需要显示一些带有特殊样式的文本,比如说带有下划线、删除线、斜体、空心字体、背景色、阴影以及图文混排(一种文字中夹杂图片的显示效果)。通常想要实现这些效果要使用到iOS的Foundation框架提供的NSAttributedString类,NSAttributedString类中有许多属性,不同属性对应不同的文本样式。本文主要对这些属性做一个解释说明,并会结合实际代码来应用它们。 ...

雨夜枫起的博客 914

CarPlay盒子选购避坑指南:为什么你的车机破解了却用不了?从USB设备ID说起

本文深入解析CarPlay盒子硬件兼容性问题,从USB设备ID匹配到车机适配逻辑,揭示破解成功却无法使用的根本原因。通过分析USB设备识别的核心要素和逆向工程usb_device_manager.xml文件,提供三种主流解决方案对比,并强调操作中的硬件保护机制,帮助车主避免常见陷阱。

weixin_30706691的博客 472

NSAttributedString 详解 (IOS5.1可用)【转】

原帖地址:http://blog.sina.com.cn/s/blog_6cffce7701016k7p.html NSAttributedString可以让我们使一个字符串显示的多样化,但是目前到iOS 5为止,好像对它支持的不是很好,因为显示起来不太方便(至少没有在OS X上方便)。 首先导入CoreText.framework,并在需要使用的文件中导入: #import&lt...

weixin_30695195的博客 91

低速信号设计之 ESPI 篇

ESPI 是 Intel 推出的增强型串行外设接口,基于 SPI 发展而来,新增 Reset# 和 Alert# 信号,采用点对点主从通信模型,最高速率达 33MHz,支持半双工与 DMA 传输。 其物理接口含 10 条线路,通信协议分物理层、数据链路层等四层。布局布线需关注信号完整性、电源完整性,还得考虑与 SPI 的兼容性。 ESPI 广泛应用于计算机系统(连接 BIOS、电源管理器等)和工业控制领域,具有引脚少、功耗低等优势,但设计复杂且存在兼容性挑战。

qq_16237389的博客 1374

用python画年度和月度的日历图

用python画各种日历图,可以区分月份来画也可以画一整年的,日历图中可以体现自己的信息

weixin_44853840的博客 2138

NSAttributedString详解

转自: http://www.cnblogs.com/whyandinside/archive/2013/12/27/3493475.html 转自:http://blog.youkuaiyun.com/zhangao0086/article/details/7616385 An NSAttributedString object manages character strings and ass

博客标题不能为空 641

【目标检测】全局上下文感知的详解

目标检测中的全局上下文感知(Global Context Awareness)​是指模型在定位和识别目标时,能够有效利用图像中全局或大范围的上下文信息(如场景语义、目标间关系、空间布局等),而不仅仅依赖局部特征。这种能力显著提升了检测的鲁棒性,尤其是在复杂场景(如遮挡、小目标、密集目标)中表现突出。

浩瀚之水的专栏 643

Markdown7入门教程:5分钟集成NSAttributedString解析器

Markdown7是一款高效的Markdown转NSAttributedString解析工具,能帮助iOS开发者快速将Markdown文本转换为富文本格式。本教程将带你在5分钟内完成集成,轻松实现Markdown内容的优雅展示。 ## 🌟 为什么选择Markdown7? Markdown7的核心优势在于其轻量级设计和原生iOS支持。通过[src/NSAttributedStringMarkd

gitblog_00825的博客 189

【RT-DETR有效改进】计算训练好权重文件对应的FPS、推理每张图片的平均时间(科研必备)

本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有帮助,可以清晰帮你展示出模型速度性能的提升以及轻量化的效果(模型大小),对于以提高精度为目的的读者本文也能够帮助大家展示出现阶段的模型速度指标。所以本文的内容是十分有用的机制,对于大家发表论文来说,下面的图片为运行后的效果可以看到,该有的指标均已打印(本文内容为我独家创新,全网无第二份)下面是效果图和文

Snu77的博客 3628

《ESP32单片机基础入门》第2章:开发环境搭建

【代码】《ESP32单片机基础入门》第2章:开发环境搭建。

2301_79143213的博客 579

Attributed与原生NSAttributedString对比:性能与安全性分析

想要在iOS应用中创建美观的富文本显示?Attributed框架为您提供了**类型安全**的NSAttributedString替代方案!作为iOS开发中处理富文本的**终极解决方案**,Attributed通过强类型API彻底解决了原生NSAttributedString的运行时崩溃风险。本文将深入对比Attributed框架与原生NSAttributedString在**性能表现**和**代码

gitblog_00816的博客 773

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

告别HTML转换!CocoaMarkdown高效生成NSAttributedString的5个技巧

CocoaMarkdown是一款专为iOS和OS X平台设计的Markdown解析与渲染框架,它能帮助开发者轻松将Markdown文本转换为富文本格式,无需复杂的HTML转换过程。本文将分享5个实用技巧,助你高效使用CocoaMarkdown生成NSAttributedString,提升移动应用的文本展示体验。 ## 1. 快速集成:3行代码实现基础渲染 CocoaMarkdown的核心优势在

gitblog_00525的博客 407

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

如何用Slash快速构建自定义样式富文本?iOS/OS X开发者必学的5分钟入门指南

Slash是一个简单、可扩展的标记语言库,专门用于在iOS和OS X平台上快速创建和样式化NSAttributedString富文本。对于需要处理复杂文本格式的Objective-C开发者来说,这个工具能够显著简化富文本的创建过程。通过类似HTML的标记语法,开发者可以轻松定义文本样式,而无需编写冗长的属性字典代码。 ## 📱 什么是Slash富文本库? Slash是一个轻量级的Object

gitblog_01153的博客 682

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Slash核心功能全解析:从基础标签到高级样式定制,3步掌握富文本字符串魔法

想要在iOS和macOS应用中快速创建精美的富文本字符串吗?Slash正是你需要的终极解决方案!这个简单而强大的开源库通过类似HTML的标记语言,让富文本字符串的创建变得前所未有的简单。无论你是iOS开发新手还是经验丰富的开发者,Slash都能帮助你轻松实现复杂的文本样式定制。🎯 ## 为什么选择Slash?简单高效的富文本处理工具 在iOS和macOS开发中,创建富文本字符串通常需要编写大

gitblog_01091的博客 1070

Slash:打造优雅富文本字符串的终极解决方案,让NSAttributedString创建从未如此简单

Slash是一款简单且可扩展的标记语言,专为简化NSAttributedString的创建而设计。它采用类HTML的语法风格,同时允许用户自定义标签含义,为iOS和OS X开发者提供了一种高效创建富文本字符串的全新方式。 ## 🚀 为什么选择Slash?传统NSAttributedString创建的痛点 在Slash出现之前,开发者创建富文本通常面临两大挑战:要么编写冗长复杂的属性字典代码,

gitblog_00809的博客 737

SwiftRichString 使用指南

SwiftRichString 是一个优雅的 Swift 库,专为简化和美化在Swift项目中处理富文本(NSAttributedString)而设计。它以 woman-with-artistic-makeup 的艺术风格自我呈现,提供了强大且直观的方法来创建、组合和调整文本样式。此库支持iOS平台,并完美兼容Swift 5.1及以上的函数构建器,便于进行字符串的编排。SwiftRichStrin...

gitblog_00765的博客 506

NSAttributedStringBuilder入门指南:用SwiftUI语法轻松构建富文本

想要在iOS或macOS应用中创建复杂的富文本显示吗?NSAttributedStringBuilder是一个强大的开源库,它让您可以使用SwiftUI风格的声明式语法轻松构建NSAttributedString!这个终极工具将彻底改变您在Swift项目中处理富文本的方式。 ## 🚀 什么是NSAttributedStringBuilder? NSAttributedStringBuilde

gitblog_00836的博客 733

iOS8下UILabel如何自适应高度(自动换行)

ios8 uilabel自适应

yaya_lovepiggy的博客 543

NSAttributedString 动态计算字符串的高度ios6,7

svrn #define CELL_CONTENT_MARGIN 10 #define KLEFT_MARGIN 8.F #define KFONT_SIZE 19.f - (CGFloat)tableView:tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ NSString *contentText = [[hi

laencho的专栏 2203

从开发者的角度审视iOS 6与iPhone 5

全新的显示效果 【2012年9月27日 51CTO外电头条】在接触iPhone5之初,我想大家最先注意到的可能就是其屏幕尺寸的改动——没错,苹果终于对经典设计做出变更,对视网膜屏加以扩展。iPhone4所使用的是3.5英寸(指对角线长度)640x960像素的分辨率方案,而iPhone5则拥有分辨率为640x1136像素的4寸屏幕。 作为用户,我们可能会对iPhone5的新外形赞叹不已;然而从开...

移动编程 187
上一篇: 各种数字格式化
下一篇: 解决删除nsuserdefault全部内容后创建uiwebview挂机
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值