国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

coreText

2019-11-09 17:47:47
字體:
來源:轉載
供稿:網友

在前面一篇文章中,介紹了屬性文字的基本使用,本章節主要針對文字的段落樣式展開演示說明。

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

 

[cpp] view plaincopyNSString *src [NSString stringWithString:@"其實流程是這樣的: 1、生成要繪制的NSAttributedString對象。 2、生成一個CTFramesetterRef對象,然后創建一個CGPath對象,這個Path對象用于表示可繪制區域坐標值、長寬。 3、使用上面生成的setter和path生成一個CTFrameRef對象,這個對象包含了這兩個對象的信息(字體信息、坐標信息),它就可以使用CTFrameDraw方法繪制了。"];      NSMutableAttributedStrinmabstring [[NSMutableAttributedStrinalloc]initWithString:src];            long slen [mabstring length];  

 

 

[cpp] view plaincopy"font-family: Arial, Helvetica, sans-serif;">  在未設置段落樣式的情況下,效果:  

 

從上面的交果來看,想必大家也看到了,英文部份換行顯示了。這個一般情況下不注意,但在大的段落文章中就會出現不對齊現象。

先不管上面的,下面逐個來演示一下段落屬性。段落樣式定義:

 

[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,   //段落前間距 在一個段落的前面加上間隔。TOP   kCTParagraphStyleSpecifierBaseWritingDirection 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//tab      CTTextAlignment 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"];            NSMutableAttributedStrinmabstring [[NSMutableAttributedStrinalloc]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 ,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];
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夏邑县| 荥阳市| 正宁县| 台山市| 石棉县| 邯郸县| 同心县| 佳木斯市| 抚宁县| 龙川县| 高台县| 玉溪市| 右玉县| 新乡县| 郁南县| 东莞市| 义马市| 东兴市| 盈江县| 丰顺县| 桦南县| 黑龙江省| 沭阳县| 天水市| 维西| 烟台市| 巴马| 讷河市| 什邡市| 泾源县| 克拉玛依市| 中方县| 江城| 南和县| 海安县| 阿鲁科尔沁旗| 广德县| 滦南县| 阳东县| 沽源县| 荥经县|