CoreText --- 段落样子CTParagraphStyle

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

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

[CPP]   鉴于普通 副本
  1. 的NSString * SRC = [NSString的stringWithString:@“其实流程是这样的:1,生成要绘制的NSAttributedString对象。 2、生成一个CTFramesetterRef对象,然后创建一个CGPath对象,这个Path对象用于表示可绘制区域坐标值、长宽。 3、使用上面生成的setter和path生成一个CTFrameRef对象,这个对象包含了这两个对象的信息(字体信息、坐标信息),它就可以使用CTFrameDraw方法绘制了。"];  
  2.     NSMutableAttributedString * mabstring = [[NSMutableAttributedString的alloc] initWithString:来源];  
  3.       
  4.      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);  
}  
 
 
 
 
 
 
 
 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值