您的位置:首页 > 移动开发 > IOS开发

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

2015-10-12 14:17 447 查看
在前面一篇文章中,介绍了属性文字的基本使用,本章节主要针对文字的段落样式展开演示说明。先定义一段演示文字(文字中有中,英文)。[cpp] view plaincopyNSString *src = [NSString stringWithString:@"其实流程是这样的: 1、生成要绘制的NSAttributedString对象。 2、生成一个CTFramesetterRef对象,然后创建一个CGPath对象,这个Path对象用于表示可绘制区域坐标值、长宽。 3、使用上面生成的setter和path生成一个CTFrameRef对象,这个对象包含了这两个对象的信息(字体信息、坐标信息),它就可以使用CTFrameDraw方法绘制了。"];NSMutableAttributedString * mabstring = [[NSMutableAttributedString alloc]initWithString:src];long slen = [mabstring length];[cpp] view plaincopy<span style="font-family: Arial, Helvetica, sans-serif;"> 在未设置段落样式的情况下,效果:</span>从上面的交果来看,想必大家也看到了,英文部份换行显示了。这个一般情况下不注意,但在大的段落文章中就会出现不对齐现象。先不管上面的,下面逐个来演示一下段落属性。段落样式定义:[cpp] view plaincopykCTParagraphStyleSpecifierAlignment = 0, //对齐属性kCTParagraphStyleSpecifierFirstLineHeadIndent = 1, //首行缩进kCTParagraphStyleSpecifierHeadIndent = 2, //段头缩进kCTParagraphStyleSpecifierTailIndent = 3, //段尾缩进kCTParagraphStyleSpecifierTabStops = 4, //制表符模式kCTParagraphStyleSpecifierDefaultTabInterval = 5, //默认tab间隔kCTParagraphStyleSpecifierLineBreakMode = 6, //换行模式kCTParagraphStyleSpecifierLineHeightMultiple = 7, //多行高kCTParagraphStyleSpecifierMaximumLineHeight = 8, //最大行高kCTParagraphStyleSpecifierMinimumLineHeight = 9, //最小行高kCTParagraphStyleSpecifierLineSpacing = 10, //行距kCTParagraphStyleSpecifierParagraphSpacing = 11, //段落间距 在段的未尾(Bottom)加上间隔,这个值为负数。kCTParagraphStyleSpecifierParagraphSpacingBefore = 12, //段落前间距 在一个段落的前面加上间隔。TOPkCTParagraphStyleSpecifierBaseWritingDirection = 13, //基本书写方向kCTParagraphStyleSpecifierMaximumLineSpacing = 14, //最大行距kCTParagraphStyleSpecifierMinimumLineSpacing = 15, //最小行距kCTParagraphStyleSpecifierLineSpacingAdjustment = 16, //行距调整kCTParagraphStyleSpecifierCount = 17, //对齐属性:
kCTLeftTextAlignment = 0,                //左对齐
kCTRightTextAlignment = 1,               //右对齐
kCTCenterTextAlignment = 2,              //居中对齐
kCTJustifiedTextAlignment = 3,           //文本对齐
kCTNaturalTextAlignment = 4              //自然文本对齐
段落默认样式为
kCTNaturalTextAlignment
效果:
居中:
文本对齐Justified效果
对齐方式设置代码:
[cpp]view plaincopyCTTextAlignment alignment = kCTJustifiedTextAlignment;CTParagraphStyleSetting alignmentStyle;alignmentStyle.spec=kCTParagraphStyleSpecifierAlignment;//指定为对齐属性alignmentStyle.valueSize=sizeof(alignment);alignmentStyle.value=&alignment;
首行缩进代码:
[cpp]view plaincopy//首行缩进CGFloat fristlineindent = 24.0f;CTParagraphStyleSetting fristline;fristline.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent;fristline.value = &fristlineindent;fristline.valueSize = sizeof(float);
效果:
段头缩进代码:
[cpp]view plaincopy//段缩进CGFloat headindent = 10.0f;CTParagraphStyleSetting head;head.spec = kCTParagraphStyleSpecifierHeadIndent;head.value = &headindent;head.valueSize = sizeof(float);
效果:
段尾缩进代码:
[cpp]view plaincopy//段尾缩进CGFloat tailindent = 50.0f;CTParagraphStyleSetting tail;tail.spec = kCTParagraphStyleSpecifierTailIndent;tail.value = &tailindent;tail.valueSize = sizeof(float);
效果:
制表符(tab)代码:
[cpp]view plaincopy//tabCTTextAlignment tabalignment = kCTJustifiedTextAlignment;CTTextTabRef texttab = CTTextTabCreate(tabalignment, 24, NULL);CTParagraphStyleSetting tab;tab.spec = kCTParagraphStyleSpecifierTabStops;tab.value = &texttab;tab.valueSize = sizeof(CTTextTabRef);
效果(未看出哪有变化感觉行距大了点):
换行模式:
kCTLineBreakByWordWrapping = 0,        //出现在单词边界时起作用,如果该单词不在能在一行里显示时,整体换行。此为段的默认值。
kCTLineBreakByCharWrapping = 1,        //当一行中最后一个位置的大小不能容纳一个字符时,才进行换行。
kCTLineBreakByClipping = 2,            //超出画布边缘部份将被截除。
kCTLineBreakByTruncatingHead = 3,      //截除前面部份,只保留后面一行的数据。前部份以...代替。
kCTLineBreakByTruncatingTail = 4,      //截除后面部份,只保留前面一行的数据,后部份以...代替。
kCTLineBreakByTruncatingMiddle = 5     //在一行中显示段文字的前面和后面文字,中间文字使用...代替。
换行模式代码:
[cpp]view plaincopy//换行模式CTParagraphStyleSetting lineBreakMode;CTLineBreakMode lineBreak = kCTLineBreakByWordWrapping;//kCTLineBreakByCharWrapping;//换行模式lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;lineBreakMode.value = &lineBreak;lineBreakMode.valueSize = sizeof(CTLineBreakMode);
kCTLineBreakByWordWrapping
效果:
kCTLineBreakByCharWrapping
效果:
kCTLineBreakByClipping
效果:
kCTLineBreakByTruncatingHead
效果:
kCTLineBreakByTruncatingTail
效果:
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);//tabCTTextAlignment 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[] = {alignmentStylefristline,head,tail,tab,lineBreakMode,Muti,Max,lineSpaceSetting,writedicindentSetting};//通过设置项产生段落样式对象CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 11);// build attributesNSMutableDictionary *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);}
-(void)drawRect:(CGRect)rect
{
   [self ParagraphStyle];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: