CoreText-文字排版

中文版CoreText 使用教程:以创建一个简单的杂志应用为 详细 中文化 国外的一篇给力教程!! 从基础学起不错 立即下载

 一、Core Text简介

Core Text是苹果官方提供的底层文字排版引擎,通过它,我们可以精确地控制文字的排版:如文字颜色、字体、字与字间距、行间距。甚至可以精确地控制每行的位置,计算某串文字的范围。正因为它有如此强大的功能,好多富文本的效果,都是通过它来实现的。而且使用它来做富文本效果,比通过UIWebview+js,效率更高,内存占用更少。只是其入门门槛较高,使用上稍微有点麻烦。

二、Core Text类及其关系(图片来自Apple官方):


CTFramesetter:

 通过一个属性字符串初始化它,通过它可以创建CTFrame

CTFrame:

 可以理解成一段文字,这段文字可能是创建CTFramesetter时,所使用的属性字符串的部分或者全部。

CTLine:

 CTFrame又是由一行一行的文字组成,每一行文字对应一个CTLine对象;

可以从CTFrame中获取,也可以单独通过一个属性字符串创建它

通过相关API,可以获取到CTLine的位置,在CTFrame所代表的字符串中的范围,可以获取这一行文字的上行距离(ascend)、下行距离(descent)

CTRun: 

每行文字又是由一个一个的字符组成,而每一个字符对应一个CTRun对象。

由CoreText自动创建,我们只需通过相关API,从CTLine中获取即可。


三、排版-相关属性(图片来自Apple官方)



1、红色线条:BaseLine 是一条假想出来的线,

2、Ascned: 上行距离,即baseLine 到 该行文字最高点的距离

3、Descend: 下行距离,即BaseLine到该行文字最低点的距离

所以在有emoji表情的文字中,因为emoji的descent比文字的descent大,所以整行的descent的为emoji的descnet,

所以会出现在有emoji的一段文字中,行间距不一致的情况。

特别说明:

1、通过相关CoreText API 获取到的Descend是大于0的,而不是向网上其他查到的资料所说的是小于0的

i.e  CTLineGetTypographicBounds ( CTLineRef line, CGFloat *ascent, CGFloat *descent, CGFloat *leading )

所获取到的descent是大于0的

2、UIFont的descender属性,倒是小于0的


四、坐标系

1、UIKit的坐标系是左上角为原点,X轴向右为正,Y轴向下为正

2、而Core Text使用的坐标系是左下角为原点,X轴向右为正,Y轴向上为正。

当进入drawRect方法前,为了与UIKit的坐标系一致,系统内部会自动翻转了一下坐标系,变成左上角为原点

所以进入到drawRect方法时,若没有再次进行坐标系的翻转、平移,直接通过CoreText进行文字排版,会出现文字镜像倒置的现象。

再次翻转坐标系,变成左下角为原点:

CGContextRef ctx = UIGraphicsGetCurrentContext();
//平移
CGContextTranslateCTM(ctx, 0, rect.size.height);
//翻转Y轴
CGContextScaleCTM(ctx, 1, -1);
//设置文字矩阵
CGContextSetTextMatrix(ctx, CGAffineTransformIdentity);

五、一个实例

- (void)drawRect:(CGRect)rect {
    if (_text.length == 0) {
        return;
    }
   
    rect.size.height = SYTLabel_MAX_Height;
    
    //将坐标系再次变为原点在左下角的笛卡尔坐标系
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, 0, rect.size.height);
    CGContextScaleCTM(ctx, 1, -1);
    CGContextSetTextMatrix(ctx, CGAffineTransformIdentity);
    
    //通过要渲染的文本,创建FrameSetter
    CTFramesetterRef setter = [self createFrameSetterWithText:_text];
   
    //创建一帧 指定画在rect的矩阵区域内
    CTFrameRef frame = [self createFrameInRect:rect fromSetter:setter];
    
    //获取所有CTLine对象
    NSArray *lines = (__bridge NSArray*)CTFrameGetLines(frame);
    NSInteger count = lines.count;
    CGPoint origins[count];
    //获取每行的原点 注意这个原点是在BaseLine上的 请参考三、排版属性下的那张图
    CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), origins);
    
    //此时坐标原点左下角 第一行的起始Y值 = rect.size.height - 行高 (这跟我们的书写习惯是一致的)
    CGFloat y = rect.size.height;
    //行高=font.ascender-_font.descender 为什么是减掉descender呢? 因为UIFont的descender是小于0的
    //这里行高使用字体的行高 是为了避免文本中存在emoji 导致行间距不一致
    CGFloat lineH = ceil(_font.ascender - _font.descender);
    for (NSInteger i = 0; i < count; i++) {
        CGPoint origin = origins[i];
        CTLineRef line = (__bridge CTLineRef)lines[i];
	//测试发现获取到的descend是大于0的
        CGFloat ascend,descend;
        CTLineGetTypographicBounds(line, &ascend, &descend, NULL);
        y = y - lineH;
        CGContextSetTextPosition(ctx, origin.x, y);
        CTLineDraw(line, ctx);
        
        y -= _lineSpace;
    }
   
    CFRelease(frame);
    CFRelease(setter);
}


六、后记

更多相关API用法,请参考官方API文档。

随机向量函数链神经网络(RVFLNN)简介——附测试代码 宽度学习(Broad Learning System)原理介绍:随机向量函数链神经网络(RVFLNN) 目录宽度学习(Broad Learning System)原理介绍:随机向量函数链神经网络(RVFLNN)结构分析和训练优化 函数链神经网络(Functional-link neural network,简称FLNN)的结构如下图。 和深度神经网络结构不同的是,FLNN相当于把隐层放到了输入层中,作为增强结点(Enhancement nodes)。也可以理解成FLNN在输入层就对输入向量进行了非线性变换 阅读详情

相关推荐

【HSCNN解析】HSCNN:从欠采样光谱图重建高光谱图的CNN网络

本文介绍HSCNN,是一个将欠采样光谱图重建为高光谱图的纯CNN网络,2017年提出。

上个大学哪有不疯的?硬撑罢了! 1619

[转] iOS文字排版(CoreText)那些事儿

文章转载自 http://www.cocoachina.com/applenews/devnews/2014/0521/8504.html iOS文字排版(CoreText)那些事儿 转自阿毛的蛋疼地   第一次比较深入接触iOS文字排版相关内容是在12年底,实现某IM项目聊天内容的图文混排,照着nimbus的AttributedLabel和Raywenderlish上的这篇文章《...

weixin_33862188的博客 280

EMQX 结合MySQL实现精细化ACL权限管理实战

本文详细介绍了如何通过EMQX结合MySQL实现精细化的ACL权限管理,提升物联网设备接入和消息传输的安全性。内容包括环境准备、基础配置、权限规则设计技巧以及高级应用与性能优化方案,帮助开发者快速掌握动态生效、便于管理的权限控制方法。

weixin_28683689的博客 196

Core Text 原理浅谈

iOS 开发中经常会遇到一些文字排版或者图文混排的需求,在 iOS7 以前一般都使用 CoreText 来处理这样的需求,iOS7 之后可以使用系统的 TextKit ,TextKit 是对 CoreText 的封装。 CoreText 是用于处理文字和字体的底层技术,它直接和 Core Graphics 交互;它真正负责绘制的是文本部分,如果要绘制图片,可以使用 CoreText给图片预留出位置...

Andy Coding 1653

【遥感数字图像处理(朱文泉)】第一章 数字图像基础

关于图像的定义、类型、模拟图像和数字图像

甜子yu的博客 4404

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

swift ~ font中的属性(pointSize、ascender、descende、capHeight、xHeight、leading、ineHeight)实战

联系人:石虎 QQ:1224614774昵称:嗡嘛呢叭咪哄 QQ群:807236138群称:iOS 技术交流学习群 一、例子:字体默认是 13 private lazy var titleLabel: UILabel = { let label = UILabel() label.font = UIFont.systemFont(ofSize: 13, weight: .regular) ...

石虎 2606

水下探测小白必看:单波束vs多波束声呐,5分钟搞懂核心区别

本文为水下探测新手清晰解析了单波束与多波束声呐的核心区别。单波束声呐如同精准的“手电筒”,进行逐点扫描,适用于定点测深和目标探测;而多波束声呐则像“聚光灯”,能一次性覆盖一个扇区,高效获取海底地形三维信息,是海底测绘和水下三维建模的理想选择。文章通过生动的比喻和对比表格,帮助读者快速理解两者原理、效率差异及适用场景。

linux6sysadmin的博客 1046

基于 CoreText 的排版引擎:基础

本章前言 使用 CoreText 技术,我们可以对富文本进行复杂的排版。经过一些简单的扩展,我们还可以实现对于图片,链接的点击效果。CoreText 技术相对于 UIWebView,有着更少的内存占用,以及可以在后台渲染的优点,非常适合用于内容的排版工作。 本章我们将从最基本的开始,一步一步完成一个支持图文混排、支持图片和链接点击的排版引擎。 CoreText 简介 Cor

chaoyuan899的专栏 3785

python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法

出现该Bug的原因主要是 账号密码无法登录,但原先使用该代码测试qq或者163的时候是可以通过的!问题在于各个公司邮件所处理的代码方式不一样

码农研究僧的博客 3503

Docker/Hyper-V/Wsl2等虚拟化组件一键切换工具 (附源码, Docker Desktop开发模式与三角洲游戏模式一键切换工具)

开启 Docker、Hyper-V 或 WSL2 后游戏无法启动?🎮💻 本文教你用一键批处理工具⚡快速切换“开发/游戏模式”,开发娱乐两不误!🔄✨

XiaoqiangClub的博客 698

iOS开发小技巧:NSTextAttachment图文混排时图片与文字完美对齐的3种方法

本文深入探讨iOS开发中NSTextAttachment实现图文混排时图片与文字完美对齐的3种进阶方案。从基础对齐原理到动态居中、多行文本处理等实战技巧,帮助开发者解决VIP徽章、热点图标等UI元素的像素级对齐难题,提升应用界面的视觉一致性。

egg99的博客 841

Sqlserver2012评估期已过问题解决(启动数据库服务报错1705都是同样的问题,数据库过期未激活)

一、背景: 因为之前安装sqlserver2012忘记输入序列号,如今出现评估期已过的问题,前几天忙活半天,才解决,发现网 上叙述都非常凌乱,并且仅仅有大意,有的非常难操作。所以把我操作的过程和大家交流分享: 一定要有序列号的输入。不然会有很多其它的麻烦出现: 二、问题解决: 第一步:进入SQL2012配置工具中的安装中心。 第二步:再进入左側维护选项界面,然后选择选择版本号升级。 ...

堂前燕的博客 3266

iOS开发 Coretext(文字排版)的基本用法

oreText 框架中最常用的几个类:   CTFontCTFontCollectionCTFontDescriptorCTFrameCTFramesetterCTGlyphInfoCTLineCTParagraphStyleCTRunCTTextTabCTTypesetter   先来了解一下该框架的整体视窗组合图: CTFrame 作为一个整体的画布(Ca

梦醒梦飞翔的专栏 4737

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

iOS文字排版(CoreText)

和我们平时说的字体不同,计算机意义上的字体表示的是同一大小,同一样式(Style)字形的集合。从这个意义上来说,当我们为文字设置粗体,斜体时其实是使用了另外一种字体(下划线不算)。 iOSCoreText 转自阿毛的蛋疼地   第一次比较深入接触iOS文字排版相关内容是在12年底,实现某IM项目聊天内容的图文混排,照着nimbus的A

xiaobo0134的专栏 1278

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

CoreText文字排版

类似的文字方法比较在iOS中,我们可以使用UIKit和CoreGraphics/Quartz都可以绘制文字和图片,UIKit可以提供简单的操作文本的方法,但是你无法修改文本的颜色和其中的单词,而如果使用CoreGraphics/Quartz,几乎允许你做任何系统允许做的事情,但是你必须为每个自行计算位置,并且画在屏幕上,比较麻烦,而CoreText结合了这两者,你可以完全控制位置、布局、类似文本大小

小春子的博客 640

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

coretext IOS文字排版

转自阿毛的蛋疼地   第一次比较深入接触iOS文字排版相关内容是在12年底,实现某IM项目聊天内容的图文混排,照着nimbus的AttributedLabel和Raywenderlish上的这篇文章《Core Text Tutorial for iOS: Making a Magazine App》改出了一个比较适用于聊天内容展现的图文混排(文字和表情)控件。   选择

C 617

iOS文字排版(CoreText)那些事儿

http://www.cocoachina.com/applenews/devnews/2014/0521/8504.html

Just Do It 1046

机器人核心技术实战:从ROS仿真到工程落地的完整指南

机器人技术正从概念走向广泛应用,其核心在于感知、决策与执行三大模块的协同。感知层依赖计算机视觉和力觉传感器赋予机器人“眼睛”与“皮肤”,决策层通过路径规划与任务分解形成“大脑”,执行层则借助运动控制实现精准操作。这一技术栈的价值在于解决重复、繁重或危险场景的自动化需求,广泛应用于工业装配、物流分拣及精密手术等领域。本文聚焦机器人开发中的工程化实践,以ROS操作系统和Gazebo仿真平台为基础,通过搭建开发环境、实现视觉识别与运动规划的完整示例,系统拆解了从仿真到实物部署的关键步骤与常见问题,为开发者提供了从

weixin_33834075的博客 365

iPhone用coreText(核心文本)给文字进行排版

hello!大家都知道UILabel,UITextView这些个控件,只能显示简单的文本格式,如果想要图文混排等复杂的效果,就要用到CoreText框架来实现,不过有些个复杂。 首先是要了解一下coretext的概念: The Core Text framework is an advanced, low-level technology for laying out text and

任海丽(3G/移动开发) 6227

使用CoreText排版,取得文字区域精确大小

转载于:http://ikevin.tw/209 在iOS中,要計算文字區域的大小,說實在的是有一點麻煩,因為還沒繪製文字之前,是很難得到文字的區域大小的,所以我們通常的做法是: 1.先開一個極大的區域,固定寬度,然後文字往下排。 2.設定文字大小及行距。 3.取得行數。 4.取得文字區域高度=行數X(文字大小+行距)-行距。 //註:最後一行沒有行距 5.開一個繪圖(

点点滴滴 1101

CoreText进阶(五) 文字排版样式和效果

本文的内容主要是文字的排版样式的文本的绘制效果,排版样式会涉及到内容的水平对其、行间距、段间距相关的讨论;绘制效果会涉及到文本内容的字体、颜色、阴影的相关讨论 其它文章: CoreText入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更多 CoreText进阶(五)- 文字排版样式和效果 Core...

weixin_33694172的博客 397
dotNetF
博客等级 码龄14年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值