CoreText --- 段落样子CTParagraphStyle

2023-05-16

在前面一篇文章中,介绍了属性文字的基本使用,本章节主要针对文字的段落样式展开演示说明。

先定义一段演示文字(文字中有中,英文)。

[cpp] view plain copy
  1. NSString *src = [NSString stringWithString:@"其实流程是这样的: 1、生成要绘制的NSAttributedString对象。 2、生成一个CTFramesetterRef对象,然后创建一个CGPath对象,这个Path对象用于表示可绘制区域坐标值、长宽。 3、使用上面生成的setter和path生成一个CTFrameRef对象,这个对象包含了这两个对象的信息(字体信息、坐标信息),它就可以使用CTFrameDraw方法绘制了。"];  
  2.     NSMutableAttributedString * mabstring = [[NSMutableAttributedString alloc]initWithString:src];  
  3.       
  4.     long slen = [mabstring length];  


[cpp] view plain copy
  1. <span style="font-family: Arial, Helvetica, sans-serif;">  在未设置段落样式的情况下,效果:</span>  

从上面的交果来看,想必大家也看到了,英文部份换行显示了。这个一般情况下不注意,但在大的段落文章中就会出现不对齐现象。

先不管上面的,下面逐个来演示一下段落属性。
段落样式定义:

[cpp] view plain copy
  1. kCTParagraphStyleSpecifierAlignment = 0,                 //对齐属性  
  2.  kCTParagraphStyleSpecifierFirstLineHeadIndent = 1,       //首行缩进  
  3.  kCTParagraphStyleSpecifierHeadIndent = 2,                //段头缩进  
  4.  kCTParagraphStyleSpecifierTailIndent = 3,                //段尾缩进  
  5.  kCTParagraphStyleSpecifierTabStops = 4,                  //制表符模式  
  6.  kCTParagraphStyleSpecifierDefaultTabInterval = 5,        //默认tab间隔  
  7.  kCTParagraphStyleSpecifierLineBreakMode = 6,             //换行模式  
  8.  kCTParagraphStyleSpecifierLineHeightMultiple = 7,        //多行高  
  9.  kCTParagraphStyleSpecifierMaximumLineHeight = 8,         //最大行高  
  10.  kCTParagraphStyleSpecifierMinimumLineHeight = 9,         //最小行高  
  11.  kCTParagraphStyleSpecifierLineSpacing = 10,              //行距   
  12.  kCTParagraphStyleSpecifierParagraphSpacing = 11,         //段落间距  在段的未尾(Bottom)加上间隔,这个值为负数。  
  13.  kCTParagraphStyleSpecifierParagraphSpacingBefore = 12,   //段落前间距 在一个段落的前面加上间隔。TOP  
  14.  kCTParagraphStyleSpecifierBaseWritingDirection = 13,     //基本书写方向  
  15.  kCTParagraphStyleSpecifierMaximumLineSpacing = 14,       //最大行距  
  16.  kCTParagraphStyleSpecifierMinimumLineSpacing = 15,       //最小行距  
  17.  kCTParagraphStyleSpecifierLineSpacingAdjustment = 16,    //行距调整  
  18.  kCTParagraphStyleSpecifierCount = 17,        //  

对齐属性:

kCTLeftTextAlignment = 0,                //左对齐
kCTRightTextAlignment = 1,               //右对齐
kCTCenterTextAlignment = 2,              //居中对齐
kCTJustifiedTextAlignment = 3,           //文本对齐
kCTNaturalTextAlignment = 4              //自然文本对齐  
段落默认样式为

kCTNaturalTextAlignment  

效果:  


  

居中:  


  

文本对齐Justified效果  


  

对齐方式设置代码:  

 
 
  1. CTTextAlignment alignment = kCTJustifiedTextAlignment;  
  2.     CTParagraphStyleSetting alignmentStyle;  
  3.     alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;//指定为对齐属性  
  4.     alignmentStyle.valueSize=sizeof(alignment);  
  5.     alignmentStyle.value=&alignment;  
首行缩进代码:

 
 
  1. //首行缩进  
  2.     CGFloat fristlineindent = 24.0f;  
  3.     CTParagraphStyleSetting fristline;  
  4.     fristline.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent;  
  5.     fristline.value = &fristlineindent;  
  6.     fristline.valueSize = sizeof(float);  
效果:


  

段头缩进代码:  

 
 
  1. //段缩进  
  2. CGFloat headindent = 10.0f;  
  3. CTParagraphStyleSetting head;  
  4. head.spec = kCTParagraphStyleSpecifierHeadIndent;  
  5. head.value = &headindent;  
  6. head.valueSize = sizeof(float);  
效果:


  

段尾缩进代码:  

 
 
  1. //段尾缩进  
  2. CGFloat tailindent = 50.0f;  
  3. CTParagraphStyleSetting tail;  
  4. tail.spec = kCTParagraphStyleSpecifierTailIndent;  
  5. tail.value = &tailindent;  
  6. tail.valueSize = sizeof(float);  
效果:


  

制表符(tab)代码:  

 
 
  1. //tab  
  2.     CTTextAlignment tabalignment = kCTJustifiedTextAlignment;  
  3.     CTTextTabRef texttab = CTTextTabCreate(tabalignment, 24, NULL);  
  4.     CTParagraphStyleSetting tab;  
  5.     tab.spec = kCTParagraphStyleSpecifierTabStops;  
  6.     tab.value = &texttab;  
  7.     tab.valueSize = sizeof(CTTextTabRef);  

效果(未看出哪有变化感觉行距大了点):  


  

换行模式:  

kCTLineBreakByWordWrapping = 0,        //出现在单词边界时起作用,如果该单词不在能在一行里显示时,整体换行。此为段的默认值。
kCTLineBreakByCharWrapping = 1,        //当一行中最后一个位置的大小不能容纳一个字符时,才进行换行。
kCTLineBreakByClipping = 2,            //超出画布边缘部份将被截除。
kCTLineBreakByTruncatingHead = 3,      //截除前面部份,只保留后面一行的数据。前部份以...代替。
kCTLineBreakByTruncatingTail = 4,      //截除后面部份,只保留前面一行的数据,后部份以...代替。
kCTLineBreakByTruncatingMiddle = 5     //在一行中显示段文字的前面和后面文字,中间文字使用...代替。
换行模式代码:

  
  
  1. //换行模式  
  2.    CTParagraphStyleSetting lineBreakMode;  
  3.    CTLineBreakMode lineBreak = kCTLineBreakByWordWrapping;//kCTLineBreakByCharWrapping;//换行模式  
  4.    lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;  
  5.    lineBreakMode.value = &lineBreak;  
  6.    lineBreakMode.valueSize = sizeof(CTLineBreakMode);  
kCTLineBreakByWordWrapping
效果:

kCTLineBreakByCharWrapping
效果:


kCTLineBreakByClipping
效果:


kCTLineBreakByTruncatingHead
效果:


kCTLineBreakByTruncatingTail
效果:


kCTLineBreakByTruncatingMiddle
效果:


多行高设置代码:
        
        
  1. //多行高  
  2. CGFloat MutiHeight = 10.0f;  
  3. CTParagraphStyleSetting Muti;  
  4. Muti.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  
  5. Muti.value = &MutiHeight;  
  6. Muti.valueSize = sizeof(float);  
效果:

最大行高代码:
        
        
  1. //最大行高  
  2.     CGFloat MaxHeight = 5.0f;  
  3.     CTParagraphStyleSetting Max;  
  4.     Max.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  
  5.     Max.value = &MaxHeight;  
  6.     Max.valueSize = sizeof(float);  
效果:

行距代码:
        
        
  1. //行距   
  2. CGFloat _linespace = 5.0f;  
  3. CTParagraphStyleSetting lineSpaceSetting;  
  4. lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;  
  5. lineSpaceSetting.value = &_linespace;  
  6. lineSpaceSetting.valueSize = sizeof(float);  
效果:

段前间距设置代码(段与段之间):
        
        
  1. //段前间隔  
  2. CGFloat paragraphspace = 5.0f;  
  3. CTParagraphStyleSetting paragraph;  
  4. paragraph.spec = kCTParagraphStyleSpecifierLineSpacing;  
  5. paragraph.value = ¶graphspace;  
  6. paragraph.valueSize = sizeof(float);  
效果:
kCTWritingDirectionNatural = -1,            //普通书写方向,一般习惯是从左到右写
kCTWritingDirectionLeftToRight = 0,         //从左到右写
kCTWritingDirectionRightToLeft = 1          //从右到左写


基本书写方向代码:
         
         
  1. //书写方向  
  2. CTWritingDirection wd = kCTWritingDirectionRightToLeft;  
  3. CTParagraphStyleSetting writedic;  
  4. writedic.spec = kCTParagraphStyleSpecifierBaseWritingDirection;  
  5. writedic.value = &wd;  
  6. writedic.valueSize = sizeof(CTWritingDirection);  
效果:

这个跟字体右对齐效果上类似。

好了,段落的API样式介绍到这里,里面还有很多配合设置时的效果。读者自行演示了。
下面附上draw 代码:
         
         
  1. -(void)ParagraphStyle  
  2. {  
  3.     NSString *src = [NSString stringWithString:@"其实流程是这样的: 1、生成要绘制的NSAttributedString对象。 2、生成一个CTFramesetterRef对象,然后创建一个CGPath对象,这个Path对象用于表示可绘制区域坐标值、长宽。 3、使用上面生成的setter和path生成一个CTFrameRef对象,这个对象包含了这两个对象的信息(字体信息、坐标信息),它就可以使用CTFrameDraw方法绘制了。"];  
  4.       
  5.     //修改windows回车换行为mac的回车换行  
  6.     //src = [src stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"];  
  7.       
  8.     NSMutableAttributedString * mabstring = [[NSMutableAttributedString alloc]initWithString:src];  
  9.       
  10.     long slen = [mabstring length];  
  11.       
  12.       
  13.     //创建文本对齐方式  
  14.     CTTextAlignment alignment = kCTRightTextAlignment;//kCTNaturalTextAlignment;  
  15.     CTParagraphStyleSetting alignmentStyle;  
  16.     alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;//指定为对齐属性  
  17.     alignmentStyle.valueSize=sizeof(alignment);  
  18.     alignmentStyle.value=&alignment;  
  19.       
  20.     //首行缩进  
  21.     CGFloat fristlineindent = 24.0f;  
  22.     CTParagraphStyleSetting fristline;  
  23.     fristline.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent;  
  24.     fristline.value = &fristlineindent;  
  25.     fristline.valueSize = sizeof(float);  
  26.       
  27.     //段缩进  
  28.     CGFloat headindent = 10.0f;  
  29.     CTParagraphStyleSetting head;  
  30.     head.spec = kCTParagraphStyleSpecifierHeadIndent;  
  31.     head.value = &headindent;  
  32.     head.valueSize = sizeof(float);  
  33.       
  34.     //段尾缩进  
  35.     CGFloat tailindent = 50.0f;  
  36.     CTParagraphStyleSetting tail;  
  37.     tail.spec = kCTParagraphStyleSpecifierTailIndent;  
  38.     tail.value = &tailindent;  
  39.     tail.valueSize = sizeof(float);  
  40.       
  41.     //tab  
  42.     CTTextAlignment tabalignment = kCTJustifiedTextAlignment;  
  43.     CTTextTabRef texttab = CTTextTabCreate(tabalignment, 24, NULL);  
  44.     CTParagraphStyleSetting tab;  
  45.     tab.spec = kCTParagraphStyleSpecifierTabStops;  
  46.     tab.value = &texttab;  
  47.     tab.valueSize = sizeof(CTTextTabRef);  
  48.       
  49.     //换行模式  
  50.     CTParagraphStyleSetting lineBreakMode;  
  51.     CTLineBreakMode lineBreak = kCTLineBreakByTruncatingMiddle;//kCTLineBreakByWordWrapping;//换行模式  
  52.     lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;  
  53.     lineBreakMode.value = &lineBreak;  
  54.     lineBreakMode.valueSize = sizeof(CTLineBreakMode);  
  55.       
  56.     //多行高  
  57.     CGFloat MutiHeight = 10.0f;  
  58.     CTParagraphStyleSetting Muti;  
  59.     Muti.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  
  60.     Muti.value = &MutiHeight;  
  61.     Muti.valueSize = sizeof(float);  
  62.       
  63.     //最大行高  
  64.     CGFloat MaxHeight = 5.0f;  
  65.     CTParagraphStyleSetting Max;  
  66.     Max.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  
  67.     Max.value = &MaxHeight;  
  68.     Max.valueSize = sizeof(float);  
  69.       
  70.     //行距   
  71.     CGFloat _linespace = 5.0f;  
  72.     CTParagraphStyleSetting lineSpaceSetting;  
  73.     lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;  
  74.     lineSpaceSetting.value = &_linespace;  
  75.     lineSpaceSetting.valueSize = sizeof(float);  
  76.       
  77.     //段前间隔  
  78.     CGFloat paragraphspace = 5.0f;  
  79.     CTParagraphStyleSetting paragraph;  
  80.     paragraph.spec = kCTParagraphStyleSpecifierLineSpacing;  
  81.     paragraph.value = ¶graphspace;  
  82.     paragraph.valueSize = sizeof(float);  
  83.       
  84.     //书写方向  
  85.     CTWritingDirection wd = kCTWritingDirectionRightToLeft;  
  86.     CTParagraphStyleSetting writedic;  
  87.     writedic.spec = kCTParagraphStyleSpecifierBaseWritingDirection;  
  88.     writedic.value = &wd;  
  89.     writedic.valueSize = sizeof(CTWritingDirection);  
  90.       
  91.     //组合设置  
  92.     CTParagraphStyleSetting settings[] = {  
  93.         alignmentStyle  
  94.         fristline,  
  95.         head,  
  96.         tail,  
  97.         tab,  
  98.         lineBreakMode,  
  99.         Muti,  
  100.         Max,  
  101.         lineSpaceSetting,  
  102.         writedic  
  103.         indentSetting  
  104.           
  105.     };  
  106.       
  107.     //通过设置项产生段落样式对象  
  108.     CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 11);  
  109.        
  110.     // build attributes  
  111.     NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)style forKey:(id)kCTParagraphStyleAttributeName ];  
  112.    
  113.     // set attributes to attributed string  
  114.     [mabstring addAttributes:attributes range:NSMakeRange(0, slen)];  
  115.       
  116.       
  117.     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabstring);  
  118.       
  119.     CGMutablePathRef Path = CGPathCreateMutable();  
  120.       
  121.     //坐标点在左下角  
  122.     CGPathAddRect(Path, NULL ,CGRectMake(10 , 10 ,self.bounds.size.width-20 , self.bounds.size.height-20));  
  123.       
  124.     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL);      
  125.       
  126.       
  127.       
  128.     //获取当前(View)上下文以便于之后的绘画,这个是一个离屏。  
  129.     CGContextRef context = UIGraphicsGetCurrentContext();  
  130.       
  131.     CGContextSetTextMatrix(context , CGAffineTransformIdentity);  
  132.       
  133.     //压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存  
  134.     //保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕。  
  135.     CGContextSaveGState(context);  
  136.       
  137.     //x,y轴方向移动  
  138.     CGContextTranslateCTM(context , 0 ,self.bounds.size.height);  
  139.       
  140.     //缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度  
  141.     CGContextScaleCTM(context, 1.0 ,-1.0);  
  142.       
  143.     CTFrameDraw(frame,context);  
  144.       
  145.     CGPathRelease(Path);  
  146.     CFRelease(framesetter);  
  147. }  
-(void)drawRect:(CGRect)rect
{
   [self ParagraphStyle];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoreText --- 段落样子CTParagraphStyle 的相关文章

随机推荐

  • Ubuntu 16.04 出现E: Problem executing scripts E: Sub-process returned an error code处理办法

    E Problem executing scripts APT Update Post Invoke Success 39 if usr bin test w var cache app info a e usr bin appstream
  • android studio “leaked window“ 错误

    昨天玩我做的app 发现app运行没问题 xff0c 但log里面出现下面的错误 xff1a Activity com example thirdversionclock MainActivity welcome has leaked wi
  • Archlinux 安装桌面环境 dwm + polybar

    Archlinux 安装桌面环境 dwm 43 polybar 关于git一 安装一些必要软件1 壁纸 状态栏等软件2 安装dwm和st 三 安装Polybar四 Fish Shell五 登录管理器六 一些个人使用的工具 2023 1 31
  • Arch Linux 安装和配置(陆续更新)

    Arch Linux 安装和配置 陆续更新 南国一年一度的回南天到来 xff0c 周末百无聊赖 xff0c 研究一下Arch Linux xff0c 整理此文 xff0c 其他使用笔记陆续补充 一 在Vmware中安装Arch Linux
  • ASP.NET Core MemoryCache 缓存

    ASP NET Core 中的缓存内存 xff08 MemoryCache xff09 ASP NET Core 中的缓存内存 ASP NET Core 中的分布式缓存 xff08 SQL Server 和 Redis 分布式缓存 xff0
  • FFmpeg In Android - 多媒体文件解封装/解码/保存Yuv

    FFMPEG视音频编解码零基础学习方法 100行代码实现最简单的基于FFMPEG 43 SDL的视频播放器 本文例子的源码 demuxing decoding cpp 修改自源码自带的例子ffmpeg源码 doc example demux
  • 【Java篇】多线程详解

    Java 多线程基础详解 文章目录 Java 多线程基础详解线程的相关概念一 创建线程的几种方式1 继承Thread类2 实现Runnable接口3 实现Callable接口4 推荐使用Runnable接口 二 线程安全1 线程安全问题引入
  • NotePad++ XMLTools 插件离线安装

    在使用NotePad 43 43 时 xff0c 在某些情形下 xff0c 需要格式化Xml格式内容 xff0c 可以使用Xml Tools插件 xff0c 注意下载安装包时 xff0c 需下载与NotePad 43 43 像匹配版本的插件
  • 【Windows逆向】【Qt】日志信息打印

    目录 x1f6eb 导读需求开发环境 1 示例程序Demo2 编写功能 xff08 QtCreator版本 xff09 3 编写功能 xff08 VS版本 xff09 x1f6ec 文章小结 x1f4d6 参考资料 x1f6eb 导读 需求
  • Ubuntu 18.04 安装ROS melodic文件错误问题broken packages

    反复多次尝试安装ros melodic xff0c 一直报错 xff0c 有文件损坏或者安装依赖问题 直接进入安装阶段 xff0c 前面的请看其他详细帖子 sudo apt span class token operator span ge
  • 在虚拟机安装Archlinux

    最近花了挺长一段时间练习在虚拟机安装archlinux的 xff0c 在这里跟大家分享一下经验 xff0c 如有错误 xff0c 欢迎大家指出 xff0c 谢谢大家 准备工作 archlinux镜像 43 vmware workstatio
  • Linux系统启动流程及系统裁剪

    一 内核管理简要理论 1 内核的功能 xff08 1 xff09 进程管理 xff08 2 xff09 内存管理 xff08 内核管理代码中代码量最大的部分 xff09 xff08 3 xff09 I O管理 xff1a 中断及中断处理 x
  • UNIX环境高级编程习题——第三章

    第三章习题 3 1 当读 写磁盘文件时 xff0c 本章中描述的函数确实是不带缓冲机制的吗 xff1f 请说明原因 xff1a span class hljs number 1 span 本章中描述的read和write函数都是系统调用 x
  • Ubuntu 16.04 安装Vmware Workstation12

    1 安装Vmware Workstation12 1 从官网上获取http www vmware com products workstation workstation evaluation html 2 如果觉得上面的方法下载得比较慢
  • Idea2017查看Class字节码文件

    Idea查看字节码文件的原理 1 javap命令的使用 在jdk工具包的bin目录下 xff0c 有一个java可执行文件javap xff0c 该工具可以查看java编译后的class文件 使用命令如下命令进行查看 javap span
  • Idea配置Web项目路径以及使用非默认Tomcat启动

    1 Web项目发布路径配置 1 首先点击Run gt Edit Configurations 2 点击左上角绿色的加号 xff0c 选择Tomcat gt Local 3 点击Deployment 4 点击绿色的小铅笔 5 在此处设置Out
  • emacs下org-mode导出pdf时pdflatex无法找到的问题解决方案

    配置环境 Deepin15 6 Linux emacs25 2 发现的问题 系统没有找到pdflatex命令 xff0c org mode无法导出latex的pdf 解决步骤 安装texlive2018 因为pdflatex是texlive
  • 通过Flask框架封装Tushare获取的日线股票数据

    概要介绍 概要介绍 xff08 TuShare id 282782 xff09 当我们需要进行量化交易分析 xff0c 或者通过代码进行股票的数据计算 xff0c 研究金融时 xff0c 我们需要获取最基本的股票价格 xff0c 开盘价收盘
  • IBM Was 打补丁记录

    0 拷贝解压ifph52925升级包 通过FTP工具 xff0c 把压缩包传到服务器 xff0c unzip d test01 9 0 0 0 ws was ifph52925 zip 1 停掉was 服务 ps ef grep was k
  • CoreText --- 段落样子CTParagraphStyle

    在前面一篇文章中 xff0c 介绍了属性文字的基本使用 xff0c 本章节主要针对文字的段落样式展开演示说明 先定义一段演示文字 xff08 文字中有中 xff0c 英文 xff09 cpp view plain copy NSString