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

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

[CPP]  鉴于普通副本
  1. 的NSString * SRC = [NSString的stringWithString:@“其实流程是这样的:1,生成要绘制的NSAttributedString对象。 2、生成一个CTFramesetterRef对象,然后创建一个CGPath对象,这个Path对象用于表示可绘制区域坐标值、长宽。 3、使用上面生成的setter和path生成一个CTFrameRef对象,这个对象包含了这两个对象的信息(字体信息、坐标信息),它就可以使用CTFrameDraw方法绘制了。"];
  2. NSMutableAttributedString * mabstring = [[NSMutableAttributedString的alloc] initWithString:来源];
  3. 长 SLEN = [mabstring长度];
[CPP]  鉴于普通副本
  1. <跨度风格=“字体家庭:宋体,黑体,无衬线;”>在未设置段落样式的情况下,效果:</ SPAN>

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

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

[CPP]  鉴于普通副本
  1. kCTParagraphStyleSpecifierAlignment = 0,                 / /对齐属性
  2. kCTParagraphStyleSpecifierFirstLineHeadIndent = 1,       / /首行缩进
  3. kCTParagraphStyleSpecifierHeadIndent = 2,                / /段头缩进
  4. kCTParagraphStyleSpecifierTailIndent = 3,                / /段尾缩进
  5. kCTParagraphStyleSpecifierTabStops = 4,                  / /制表符模式
  6. kCTParagraphStyleSpecifierDefaultTabInterval = 5,        / /默认标签间隔
  7. kCTParagraphStyleSpecifierLineBreakMode = 6,1             / /换行模式
  8. kCTParagraphStyleSpecifierLineHeightMultiple = 7,        / /多行高
  9. kCTParagraphStyleSpecifierMaximumLineHeight = 8,         / /最大行高
  10. kCTParagraphStyleSpecifierMinimumLineHeight = 9,         / /最小行高
  11. kCTParagraphStyleSpecifierLineSpacing = 10,              / /行距
  12. kCTParagraphStyleSpecifierParagraphSpacing = 11,         / /段落间距在段的未尾(底部)加上间隔,这个值为负数。
  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
</pre><pre code_snippet_id="386650" snippet_file_name="blog_20140611_2_2870886" name="code" class="declaration" style="white-space: pre-wrap; word-wrap: break-word; line-height: 26px; margin: 0em 0.333em 1em 0.5em; font-size: 13px; font-family: Courier, Consolas, monospace; color: rgb(102, 102, 102); background-color: rgb(255, 255, 255);">kCTLineBreakByTruncatingMiddle
效果:
多行高设置代码:
[cpp] view plaincopy
//多行高
CGFloat MutiHeight = 10.0f;
CTParagraphStyleSetting Muti;
Muti.spec = kCTParagraphStyleSpecifierLineHeightMultiple;
Muti.value = &MutiHeight;
Muti.valueSize = sizeof(float);
效果:
最大行高代码:
[cpp] view plaincopy
//最大行高
CGFloat MaxHeight = 5.0f;
CTParagraphStyleSetting Max;
Max.spec = kCTParagraphStyleSpecifierLineHeightMultiple;
Max.value = &MaxHeight;
Max.valueSize = sizeof(float);
效果:
行距代码:
[cpp] view plaincopy
//行距
CGFloat _linespace = 5.0f;
CTParagraphStyleSetting lineSpaceSetting;
lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;
lineSpaceSetting.value = &_linespace;
lineSpaceSetting.valueSize = sizeof(float);
效果:
段前间距设置代码(段与段之间):
[cpp] view plaincopy
//段前间隔
CGFloat paragraphspace = 5.0f;
CTParagraphStyleSetting paragraph;
paragraph.spec = kCTParagraphStyleSpecifierLineSpacing;
paragraph.value = ¶graphspace;
paragraph.valueSize = sizeof(float);
效果:
kCTWritingDirectionNatural = -1,            //普通书写方向,一般习惯是从左到右写
kCTWritingDirectionLeftToRight = 0,         //从左到右写
kCTWritingDirectionRightToLeft = 1          //从右到左写
基本书写方向代码:
[cpp] view plaincopy
//书写方向
CTWritingDirection wd = kCTWritingDirectionRightToLeft;
CTParagraphStyleSetting writedic;
writedic.spec = kCTParagraphStyleSpecifierBaseWritingDirection;
writedic.value = &wd;
writedic.valueSize = sizeof(CTWritingDirection);
效果:
这个跟字体右对齐效果上类似。
好了,段落的API样式介绍到这里,里面还有很多配合设置时的效果。读者自行演示了。
下面附上draw 代码:
[cpp] view plaincopy
-(void)ParagraphStyle
{
NSString *src = [NSString stringWithString:@"其实流程是这样的: 1、生成要绘制的NSAttributedString对象。 2、生成一个CTFramesetterRef对象,然后创建一个CGPath对象,这个Path对象用于表示可绘制区域坐标值、长宽。 3、使用上面生成的setter和path生成一个CTFrameRef对象,这个对象包含了这两个对象的信息(字体信息、坐标信息),它就可以使用CTFrameDraw方法绘制了。"];
//修改windows回车换行为mac的回车换行
//src = [src stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"];
NSMutableAttributedString * mabstring = [[NSMutableAttributedString alloc]initWithString:src];
long slen = [mabstring length];
//创建文本对齐方式
CTTextAlignment alignment = kCTRightTextAlignment;//kCTNaturalTextAlignment;
CTParagraphStyleSetting alignmentStyle;
alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;//指定为对齐属性
alignmentStyle.valueSize=sizeof(alignment);
alignmentStyle.value=&alignment;
//首行缩进
CGFloat fristlineindent = 24.0f;
CTParagraphStyleSetting fristline;
fristline.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent;
fristline.value = &fristlineindent;
fristline.valueSize = sizeof(float);
//段缩进
CGFloat headindent = 10.0f;
CTParagraphStyleSetting head;
head.spec = kCTParagraphStyleSpecifierHeadIndent;
head.value = &headindent;
head.valueSize = sizeof(float);
//段尾缩进
CGFloat tailindent = 50.0f;
CTParagraphStyleSetting tail;
tail.spec = kCTParagraphStyleSpecifierTailIndent;
tail.value = &tailindent;
tail.valueSize = sizeof(float);
//tab
CTTextAlignment tabalignment = kCTJustifiedTextAlignment;
CTTextTabRef texttab = CTTextTabCreate(tabalignment, 24, NULL);
CTParagraphStyleSetting tab;
tab.spec = kCTParagraphStyleSpecifierTabStops;
tab.value = &texttab;
tab.valueSize = sizeof(CTTextTabRef);
//换行模式
CTParagraphStyleSetting lineBreakMode;
CTLineBreakMode lineBreak = kCTLineBreakByTruncatingMiddle;//kCTLineBreakByWordWrapping;//换行模式
lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;
lineBreakMode.value = &lineBreak;
lineBreakMode.valueSize = sizeof(CTLineBreakMode);
//多行高
CGFloat MutiHeight = 10.0f;
CTParagraphStyleSetting Muti;
Muti.spec = kCTParagraphStyleSpecifierLineHeightMultiple;
Muti.value = &MutiHeight;
Muti.valueSize = sizeof(float);
//最大行高
CGFloat MaxHeight = 5.0f;
CTParagraphStyleSetting Max;
Max.spec = kCTParagraphStyleSpecifierLineHeightMultiple;
Max.value = &MaxHeight;
Max.valueSize = sizeof(float);
//行距
CGFloat _linespace = 5.0f;
CTParagraphStyleSetting lineSpaceSetting;
lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;
lineSpaceSetting.value = &_linespace;
lineSpaceSetting.valueSize = sizeof(float);
//段前间隔
CGFloat paragraphspace = 5.0f;
CTParagraphStyleSetting paragraph;
paragraph.spec = kCTParagraphStyleSpecifierLineSpacing;
paragraph.value = ¶graphspace;
paragraph.valueSize = sizeof(float);
//书写方向
CTWritingDirection wd = kCTWritingDirectionRightToLeft;
CTParagraphStyleSetting writedic;
writedic.spec = kCTParagraphStyleSpecifierBaseWritingDirection;
writedic.value = &wd;
writedic.valueSize = sizeof(CTWritingDirection);
//组合设置
CTParagraphStyleSetting settings[] = {
alignmentStyle
fristline,
head,
tail,
tab,
lineBreakMode,
Muti,
Max,
lineSpaceSetting,
writedic
indentSetting
};
//通过设置项产生段落样式对象
CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 11);
// build attributes
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)style forKey:(id)kCTParagraphStyleAttributeName ];
// set attributes to attributed string
[mabstring addAttributes:attributes range:NSMakeRange(0, slen)];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabstring);
CGMutablePathRef Path = CGPathCreateMutable();
//坐标点在左下角
CGPathAddRect(Path, NULL ,CGRectMake(10 , 10 ,self.bounds.size.width-20 , self.bounds.size.height-20));
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL);
//获取当前(View)上下文以便于之后的绘画,这个是一个离屏。
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(context , CGAffineTransformIdentity);
//压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存
//保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕。
CGContextSaveGState(context);
//x,y轴方向移动
CGContextTranslateCTM(context , 0 ,self.bounds.size.height);
//缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度
CGContextScaleCTM(context, 1.0 ,-1.0);
CTFrameDraw(frame,context);
CGPathRelease(Path);
CFRelease(framesetter);
}

CoreText --- 段落样子CTParagraphStyle相关推荐

  1. IOS CoreText.framework --- 基本用法

    API接口文档. https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_ ...

  2. CoreText入坑一

    CoreText是Mac OS和iOS系统中处理文本的low-level API, 不管是使用OC还是swift, 实际我们使用CoreText都还是间接或直接使用C语言在写代码.CoreText是i ...

  3. 缩进一个字符_解析Word——Word段落格式中的几种缩进(中)

    一些闲言碎语 想要打破Word的二八定律何其难呀!80%的人仅使用了Word20%的功能!我见到了太多太多把Word当记事本去用的人.因为Word的门槛非常低,几分钟便能掌握一个功能,而且许多功能未免 ...

  4. CoreText使用介绍

    一.概述    1.CoreText是苹果创建的一个用于文字排版的框架,可以实现文字排版.图文混排等复杂的界面效果.从iOS3.2启用. 2.一个开源工具类-OHAttributedLabel,就是使 ...

  5. 小狼的单身情话之HTML网页标签和段落的初级教学

    欢迎来到单身情话之小狼版--情话微甜 如果你还是一个人,如果你有喜欢的人,如果你不想夜里孤独相伴,那么,就请你跟着小狼一起走进情话的世界吧!! 本文章适合新手,小白,初次接触HTML网页制作的朋友,如 ...

  6. 【个人向】《春物》 小说原文关键段落摘录

    Prelude 近日得闲补完春物三季番,感慨良多,意久难平,动画作了较多删减,故寻得小说拜读,决心踏入"春学"之坑. 本文摘录小说原文中若干关键段落,欲以一窥人物情感.心理发展脉络 ...

  7. word段落每行首字怎么对齐_Word段落首行左右缩进及五种对齐方式

    一.Word常规段落格式设置 要学习段落的格式,首先我们要明白一个问题:什么是段落? 直观的讲,在WORD中,有弯箭头标志的就是一个段落.如下图: 怎么产生一个段落呢?很简单,敲键盘上的"E ...

  8. [Swift通天遁地]八、媒体与动画-(13)CoreText框架实现图文混排

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  9. iOS 段落富文本使用

    #import "ViewController.h" #import <CoreText/CoreText.h> @interface ViewController ( ...

最新文章

  1. 代码注释//_您应该停止编写//的五个代码注释,并且//应该开始的一个注释
  2. iOS开发之使用XMPPFramework实现即时通信(二)
  3. auot lisp 选择集处理_第64集 python机器学习:用预处理进行参数选择
  4. 10的预览模式_谷歌相机2020年3月更新汇总,适配米10等五摄手机,30s手动曝光
  5. 记一次重大的生产上线事故,借此反思成长
  6. hdu5709-Claris Loves Painting【线段树合并】
  7. C++(STL):29 ---关联式容器map 迭代器
  8. Caffe2 的基本数据结构(Basics of Caffe2 - Workspaces, Operators, and Nets)[4]
  9. 作者:李海林,博士,华侨大学信息管理系副教授、硕士生导师。
  10. 解锁树莓派root账号
  11. 给P40让路!华为Mate 30 5G降至这个价,还贵吗?
  12. 远程办公 4 大坑,坑坑“致命”!
  13. python 链表操作 优化_Python:如何修改列表时内存的使用和优化?
  14. MMO游戏服务器从零开发(架构篇)
  15. 深圳学校积分计算机,深圳市龙岗区小学积分入学排行榜
  16. 面向 Java 开发人员的区块链链代码
  17. 有80%的疾病都是由于不良生活习惯所导致的,常见8大不良习惯,既伤身又伤神
  18. 从零开始带你称为MySQL实战优化高手(儒猿技术窝)
  19. 【python】定义一个人类Person: 定义一个方法say_hello(),可以向对方发出问候语“hello,my name is XXX” 有三个属性:名字、身高、体重
  20. H5手机搜索框的简单实现

热门文章

  1. 学校计算机设备损坏情况,计算机教室设备损坏赔偿制度.doc
  2. 5.监听器(Listener)
  3. icomoon字体图标使用步骤
  4. 二维数组示例:多次输入三条边长,判断三角形类型
  5. ng-alain+ABP Angular8版本出现关于abp不存在的问题解决办法
  6. 三种启动nginx.exe的方法
  7. 【大咖有约】华泰证券管文琦:华泰证券分布式数据库演进之路
  8. KingbaseES 工具sys_dump,sys_restore使用介绍
  9. MongoDB Capped集合 使用注意事项
  10. 安装k8s pod性能分析工具Kubectl Flame