IOS CoreText.framework --- 段落样子CTParagraphStyle

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

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

  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];  


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

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

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

  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
效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363843991_2432.jpg" alt="" />
居中:
<img src="https://img-my.csdn.net/uploads/201303/21/1363844793_2443.jpg" alt="" />
文本对齐Justified效果
<img src="https://img-my.csdn.net/uploads/201303/21/1363845030_7017.jpg" alt="" />
对齐方式设置代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span>CTTextAlignment alignment = kCTJustifiedTextAlignment;  </span></span></li><li><span>    CTParagraphStyleSetting alignmentStyle;  </span></li><li class="alt"><span>    alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;<span class="comment">//指定为对齐属性</span><span>  </span></span></li><li><span>    alignmentStyle.valueSize=<span class="keyword">sizeof</span><span>(alignment);  </span></span></li><li class="alt"><span>    alignmentStyle.value=&alignment;  </span></li></ol></div>
首行缩进代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//首行缩进</span><span>  </span></span></li><li><span>    CGFloat fristlineindent = 24.0f;  </span></li><li class="alt"><span>    CTParagraphStyleSetting fristline;  </span></li><li><span>    fristline.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent;  </span></li><li class="alt"><span>    fristline.value = &fristlineindent;  </span></li><li><span>    fristline.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li></ol></div>
效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363845227_3573.jpg" alt="" />
段头缩进代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//段缩进</span><span>  </span></span></li><li><span>CGFloat headindent = 10.0f;  </span></li><li class="alt"><span>CTParagraphStyleSetting head;  </span></li><li><span>head.spec = kCTParagraphStyleSpecifierHeadIndent;  </span></li><li class="alt"><span>head.value = &headindent;  </span></li><li><span>head.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li></ol></div>效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363845610_1096.jpg" alt="" />
段尾缩进代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//段尾缩进</span><span>  </span></span></li><li><span>CGFloat tailindent = 50.0f;  </span></li><li class="alt"><span>CTParagraphStyleSetting tail;  </span></li><li><span>tail.spec = kCTParagraphStyleSpecifierTailIndent;  </span></li><li class="alt"><span>tail.value = &tailindent;  </span></li><li><span>tail.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li></ol></div>
效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363846295_2921.jpg" alt="" />
制表符(tab)代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//tab</span><span>  </span></span></li><li><span>    CTTextAlignment tabalignment = kCTJustifiedTextAlignment;  </span></li><li class="alt"><span>    CTTextTabRef texttab = CTTextTabCreate(tabalignment, 24, NULL);  </span></li><li><span>    CTParagraphStyleSetting tab;  </span></li><li class="alt"><span>    tab.spec = kCTParagraphStyleSpecifierTabStops;  </span></li><li><span>    tab.value = &texttab;  </span></li><li class="alt"><span>    tab.valueSize = <span class="keyword">sizeof</span><span>(CTTextTabRef);  </span></span></li></ol></div>
效果(未看出哪有变化感觉行距大了点):
<img src="https://img-my.csdn.net/uploads/201303/21/1363847619_7589.jpg" alt="" />
换行模式:
<pre name="code" class="declaration" style="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)">kCTLineBreakByWordWrapping = 0,        //出现在单词边界时起作用,如果该单词不在能在一行里显示时,整体换行。此为段的默认值。
kCTLineBreakByCharWrapping = 1,        //当一行中最后一个位置的大小不能容纳一个字符时,才进行换行。
kCTLineBreakByClipping = 2,            //超出画布边缘部份将被截除。
kCTLineBreakByTruncatingHead = 3,      //截除前面部份,只保留后面一行的数据。前部份以...代替。
kCTLineBreakByTruncatingTail = 4,      //截除后面部份,只保留前面一行的数据,后部份以...代替。
kCTLineBreakByTruncatingMiddle = 5     //在一行中显示段文字的前面和后面文字,中间文字使用...代替。
换行模式代码:
 
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//换行模式</span><span>  </span></span></li><li><span>   CTParagraphStyleSetting lineBreakMode;  </span></li><li class="alt"><span>   CTLineBreakMode lineBreak = kCTLineBreakByWordWrapping;<span class="comment">//kCTLineBreakByCharWrapping;//换行模式</span><span>  </span></span></li><li><span>   lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;  </span></li><li class="alt"><span>   lineBreakMode.value = &lineBreak;  </span></li><li><span>   lineBreakMode.valueSize = <span class="keyword">sizeof</span><span>(CTLineBreakMode);  </span></span></li></ol></div>

<pre name="code" class="declaration" style="margin:0em 0.333em 1em 0.5em; background-color:rgb(255,255,255); color:rgb(102,102,102); font-size:13px; font-family:Courier,Consolas,monospace">kCTLineBreakByWordWrapping
效果:
 
<pre name="code" class="declaration" style="margin:0em 0.333em 1em 0.5em; background-color:rgb(255,255,255); font-size:13px; font-family:Courier,Consolas,monospace; color:rgb(102,102,102)"><img src="https://img-my.csdn.net/uploads/201303/21/1363843991_2432.jpg" alt="" />
kCTLineBreakByCharWrapping
效果:
 
<img src="https://img-my.csdn.net/uploads/201303/21/1363848691_8683.jpg" alt="" />
<pre name="code" class="declaration" style="margin:0em 0.333em 1em 0.5em; background-color:rgb(255,255,255); color:rgb(102,102,102); font-size:13px; font-family:Courier,Consolas,monospace">kCTLineBreakByClipping
效果:
 
<img src="https://img-my.csdn.net/uploads/201303/21/1363848819_8204.jpg" alt="" />
<pre name="code" class="declaration" style="margin:0em 0.333em 1em 0.5em; background-color:rgb(255,255,255); color:rgb(102,102,102); font-size:13px; font-family:Courier,Consolas,monospace">kCTLineBreakByTruncatingHead
效果:
 
<img src="https://img-my.csdn.net/uploads/201303/21/1363848986_1867.jpg" alt="" />
<pre name="code" class="declaration" style="margin:0em 0.333em 1em 0.5em; background-color:rgb(255,255,255); color:rgb(102,102,102); font-size:13px; font-family:Courier,Consolas,monospace">kCTLineBreakByTruncatingTail
效果:
 
<img src="https://img-my.csdn.net/uploads/201303/21/1363849143_5794.jpg" alt="" />
<pre name="code" class="declaration" style="margin:0em 0.333em 1em 0.5em; background-color:rgb(255,255,255); color:rgb(102,102,102); font-size:13px; font-family:Courier,Consolas,monospace">kCTLineBreakByTruncatingMiddle
效果:
 
<img src="https://img-my.csdn.net/uploads/201303/21/1363849277_9675.jpg" alt="" />
多行高设置代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//多行高</span><span>  </span></span></li><li><span>CGFloat MutiHeight = 10.0f;  </span></li><li class="alt"><span>CTParagraphStyleSetting Muti;  </span></li><li><span>Muti.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  </span></li><li class="alt"><span>Muti.value = &MutiHeight;  </span></li><li><span>Muti.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li></ol></div>效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363849597_4431.jpg" alt="" />
最大行高代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//最大行高</span><span>  </span></span></li><li><span>    CGFloat MaxHeight = 5.0f;  </span></li><li class="alt"><span>    CTParagraphStyleSetting Max;  </span></li><li><span>    Max.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  </span></li><li class="alt"><span>    Max.value = &MaxHeight;  </span></li><li><span>    Max.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li></ol></div>
效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363849998_2816.jpg" alt="" />
行距代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//行距 </span><span>  </span></span></li><li><span>CGFloat _linespace = 5.0f;  </span></li><li class="alt"><span>CTParagraphStyleSetting lineSpaceSetting;  </span></li><li><span>lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;  </span></li><li class="alt"><span>lineSpaceSetting.value = &_linespace;  </span></li><li><span>lineSpaceSetting.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li></ol></div>
效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363850187_1301.jpg" alt="" />
段前间距设置代码(段与段之间):
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//段前间隔</span><span>  </span></span></li><li><span>CGFloat paragraphspace = 5.0f;  </span></li><li class="alt"><span>CTParagraphStyleSetting paragraph;  </span></li><li><span>paragraph.spec = kCTParagraphStyleSpecifierLineSpacing;  </span></li><li class="alt"><span>paragraph.value = ¶graphspace;  </span></li><li><span>paragraph.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li></ol></div>效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363851108_4621.jpg" alt="" />
<pre name="code" class="declaration" style="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)">kCTWritingDirectionNatural = -1,            //普通书写方向,一般习惯是从左到右写
kCTWritingDirectionLeftToRight = 0,         //从左到右写
kCTWritingDirectionRightToLeft = 1          //从右到左写

 
基本书写方向代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span class="comment">//书写方向</span><span>  </span></span></li><li><span>CTWritingDirection wd = kCTWritingDirectionRightToLeft;  </span></li><li class="alt"><span>CTParagraphStyleSetting writedic;  </span></li><li><span>writedic.spec = kCTParagraphStyleSpecifierBaseWritingDirection;  </span></li><li class="alt"><span>writedic.value = &wd;  </span></li><li><span>writedic.valueSize = <span class="keyword">sizeof</span><span>(CTWritingDirection);  </span></span></li></ol></div>
效果:
<img src="https://img-my.csdn.net/uploads/201303/21/1363851497_8270.jpg" alt="" />
这个跟字体右对齐效果上类似。

好了,段落的API样式介绍到这里,里面还有很多配合设置时的效果。读者自行演示了。
下面附上draw 代码:
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="ViewSource" title="view plain">view plain</a><a target=_blank href="http://blog.csdn.net/fengsh998/article/details/8700627#" class="CopyToClipboard" title="copy">copy</a></div></div><ol class="dp-cpp" start="1"><li class="alt"><span><span>-(</span><span class="keyword">void</span><span>)ParagraphStyle  </span></span></li><li><span>{  </span></li><li class="alt"><span>    NSString *src = [NSString stringWithString:@<span class="string">"其实流程是这样的: 1、生成要绘制的NSAttributedString对象。 2、生成一个CTFramesetterRef对象,然后创建一个CGPath对象,这个Path对象用于表示可绘制区域坐标值、长宽。 3、使用上面生成的setter和path生成一个CTFrameRef对象,这个对象包含了这两个对象的信息(字体信息、坐标信息),它就可以使用CTFrameDraw方法绘制了。"</span><span>];  </span></span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//修改windows回车换行为mac的回车换行</span><span>  </span></span></li><li><span>    <span class="comment">//src = [src stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"];</span><span>  </span></span></li><li class="alt"><span>      </span></li><li><span>    NSMutableAttributedString * mabstring = [[NSMutableAttributedString alloc]initWithString:src];  </span></li><li class="alt"><span>      </span></li><li><span>    <span class="datatypes">long</span><span> slen = [mabstring length];  </span></span></li><li class="alt"><span>      </span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//创建文本对齐方式</span><span>  </span></span></li><li><span>    CTTextAlignment alignment = kCTRightTextAlignment;<span class="comment">//kCTNaturalTextAlignment;</span><span>  </span></span></li><li class="alt"><span>    CTParagraphStyleSetting alignmentStyle;  </span></li><li><span>    alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;<span class="comment">//指定为对齐属性</span><span>  </span></span></li><li class="alt"><span>    alignmentStyle.valueSize=<span class="keyword">sizeof</span><span>(alignment);  </span></span></li><li><span>    alignmentStyle.value=&alignment;  </span></li><li class="alt"><span>      </span></li><li><span>    <span class="comment">//首行缩进</span><span>  </span></span></li><li class="alt"><span>    CGFloat fristlineindent = 24.0f;  </span></li><li><span>    CTParagraphStyleSetting fristline;  </span></li><li class="alt"><span>    fristline.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent;  </span></li><li><span>    fristline.value = &fristlineindent;  </span></li><li class="alt"><span>    fristline.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//段缩进</span><span>  </span></span></li><li><span>    CGFloat headindent = 10.0f;  </span></li><li class="alt"><span>    CTParagraphStyleSetting head;  </span></li><li><span>    head.spec = kCTParagraphStyleSpecifierHeadIndent;  </span></li><li class="alt"><span>    head.value = &headindent;  </span></li><li><span>    head.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li><li class="alt"><span>      </span></li><li><span>    <span class="comment">//段尾缩进</span><span>  </span></span></li><li class="alt"><span>    CGFloat tailindent = 50.0f;  </span></li><li><span>    CTParagraphStyleSetting tail;  </span></li><li class="alt"><span>    tail.spec = kCTParagraphStyleSpecifierTailIndent;  </span></li><li><span>    tail.value = &tailindent;  </span></li><li class="alt"><span>    tail.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//tab</span><span>  </span></span></li><li><span>    CTTextAlignment tabalignment = kCTJustifiedTextAlignment;  </span></li><li class="alt"><span>    CTTextTabRef texttab = CTTextTabCreate(tabalignment, 24, NULL);  </span></li><li><span>    CTParagraphStyleSetting tab;  </span></li><li class="alt"><span>    tab.spec = kCTParagraphStyleSpecifierTabStops;  </span></li><li><span>    tab.value = &texttab;  </span></li><li class="alt"><span>    tab.valueSize = <span class="keyword">sizeof</span><span>(CTTextTabRef);  </span></span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//换行模式</span><span>  </span></span></li><li><span>    CTParagraphStyleSetting lineBreakMode;  </span></li><li class="alt"><span>    CTLineBreakMode lineBreak = kCTLineBreakByTruncatingMiddle;<span class="comment">//kCTLineBreakByWordWrapping;//换行模式</span><span>  </span></span></li><li><span>    lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;  </span></li><li class="alt"><span>    lineBreakMode.value = &lineBreak;  </span></li><li><span>    lineBreakMode.valueSize = <span class="keyword">sizeof</span><span>(CTLineBreakMode);  </span></span></li><li class="alt"><span>      </span></li><li><span>    <span class="comment">//多行高</span><span>  </span></span></li><li class="alt"><span>    CGFloat MutiHeight = 10.0f;  </span></li><li><span>    CTParagraphStyleSetting Muti;  </span></li><li class="alt"><span>    Muti.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  </span></li><li><span>    Muti.value = &MutiHeight;  </span></li><li class="alt"><span>    Muti.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//最大行高</span><span>  </span></span></li><li><span>    CGFloat MaxHeight = 5.0f;  </span></li><li class="alt"><span>    CTParagraphStyleSetting Max;  </span></li><li><span>    Max.spec = kCTParagraphStyleSpecifierLineHeightMultiple;  </span></li><li class="alt"><span>    Max.value = &MaxHeight;  </span></li><li><span>    Max.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li><li class="alt"><span>      </span></li><li><span>    <span class="comment">//行距 </span><span>  </span></span></li><li class="alt"><span>    CGFloat _linespace = 5.0f;  </span></li><li><span>    CTParagraphStyleSetting lineSpaceSetting;  </span></li><li class="alt"><span>    lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;  </span></li><li><span>    lineSpaceSetting.value = &_linespace;  </span></li><li class="alt"><span>    lineSpaceSetting.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//段前间隔</span><span>  </span></span></li><li><span>    CGFloat paragraphspace = 5.0f;  </span></li><li class="alt"><span>    CTParagraphStyleSetting paragraph;  </span></li><li><span>    paragraph.spec = kCTParagraphStyleSpecifierLineSpacing;  </span></li><li class="alt"><span>    paragraph.value = ¶graphspace;  </span></li><li><span>    paragraph.valueSize = <span class="keyword">sizeof</span><span>(</span><span class="datatypes">float</span><span>);  </span></span></li><li class="alt"><span>      </span></li><li><span>    <span class="comment">//书写方向</span><span>  </span></span></li><li class="alt"><span>    CTWritingDirection wd = kCTWritingDirectionRightToLeft;  </span></li><li><span>    CTParagraphStyleSetting writedic;  </span></li><li class="alt"><span>    writedic.spec = kCTParagraphStyleSpecifierBaseWritingDirection;  </span></li><li><span>    writedic.value = &wd;  </span></li><li class="alt"><span>    writedic.valueSize = <span class="keyword">sizeof</span><span>(CTWritingDirection);  </span></span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//组合设置</span><span>  </span></span></li><li><span>    CTParagraphStyleSetting settings[] = {  </span></li><li class="alt"><span>        alignmentStyle  </span></li><li><span>        fristline,  </span></li><li class="alt"><span>        head,  </span></li><li><span>        tail,  </span></li><li class="alt"><span>        tab,  </span></li><li><span>        lineBreakMode,  </span></li><li class="alt"><span>        Muti,  </span></li><li><span>        Max,  </span></li><li class="alt"><span>        lineSpaceSetting,  </span></li><li><span>        writedic  </span></li><li class="alt"><span>        indentSetting  </span></li><li><span>          </span></li><li class="alt"><span>    };  </span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//通过设置项产生段落样式对象</span><span>  </span></span></li><li><span>    CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 11);  </span></li><li class="alt"><span>       </span></li><li><span>    <span class="comment">// build attributes</span><span>  </span></span></li><li class="alt"><span>    NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)style forKey:(id)kCTParagraphStyleAttributeName ];  </span></li><li><span>   </span></li><li class="alt"><span>    <span class="comment">// set attributes to attributed string</span><span>  </span></span></li><li><span>    [mabstring addAttributes:attributes range:NSMakeRange(0, slen)];  </span></li><li class="alt"><span>      </span></li><li><span>      </span></li><li class="alt"><span>    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabstring);  </span></li><li><span>      </span></li><li class="alt"><span>    CGMutablePathRef Path = CGPathCreateMutable();  </span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//坐标点在左下角</span><span>  </span></span></li><li><span>    CGPathAddRect(Path, NULL ,CGRectMake(10 , 10 ,self.bounds.size.width-20 , self.bounds.size.height-20));  </span></li><li class="alt"><span>      </span></li><li><span>    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL);      </span></li><li class="alt"><span>      </span></li><li><span>      </span></li><li class="alt"><span>      </span></li><li><span>    <span class="comment">//获取当前(View)上下文以便于之后的绘画,这个是一个离屏。</span><span>  </span></span></li><li class="alt"><span>    CGContextRef context = UIGraphicsGetCurrentContext();  </span></li><li><span>      </span></li><li class="alt"><span>    CGContextSetTextMatrix(context , CGAffineTransformIdentity);  </span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存</span><span>  </span></span></li><li><span>    <span class="comment">//保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕。</span><span>  </span></span></li><li class="alt"><span>    CGContextSaveGState(context);  </span></li><li><span>      </span></li><li class="alt"><span>    <span class="comment">//x,y轴方向移动</span><span>  </span></span></li><li><span>    CGContextTranslateCTM(context , 0 ,self.bounds.size.height);  </span></li><li class="alt"><span>      </span></li><li><span>    <span class="comment">//缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度</span><span>  </span></span></li><li class="alt"><span>    CGContextScaleCTM(context, 1.0 ,-1.0);  </span></li><li><span>      </span></li><li class="alt"><span>    CTFrameDraw(frame,context);  </span></li><li><span>      </span></li><li class="alt"><span>    CGPathRelease(Path);  </span></li><li><span>    CFRelease(framesetter);  </span></li><li class="alt"><span>}  </span></li></ol></div>
-(void)drawRect:(CGRect)rect
{
   [self ParagraphStyle];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值