IOS利用Core Text对文字进行排版

转载 2012年03月30日 14:59:37
http://hi.baidu.com/jwq359699768/blog/item/5df305c893413d0a7e3e6f7b.html
2011-12-08 11:10

 core text 这个包默认是没有的,要自己手动添加进来。

在IOS中利用core text对文本进行排版的几个关键点如下:

     字间距:kCTKernAttributeName

     行间距:kCTParagraphStyleSpecifierLineSpacingAdjustment 或 kCTParagraphStyleSpecifierLineSpacing(不推荐使用)

    段间距:kCTParagraphStyleSpecifierParagraphSpacing

   文本对齐方式:kCTParagraphStyleSpecifierAlignment;

 

还有一点就是core text显示出来的字是颠倒的,使用时要翻转下:

   CGContextRef context = UIGraphicsGetCurrentContext();

   CGContextSetTextMatrix(context,CGAffineTransformIdentity);

   CGContextTranslateCTM(context,0,self.bounds.size.height);

   CGContextScaleCTM(context,1.0,-1.0);

 

最后一点要注意的是Mac下的回车和Windows的是不一样的,Windows下的回车是由\r \n组成的而Mac下只有一个\n,所以如果没有去掉的话在每一段的最后都会多出一个空行来,去掉的方法如下:

NSString *myString = [labelString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"];

 

具体的代码实现如下:

#import<Foundation/Foundation.h>

#import<UIKit/UIKit.h>

@interface TextLayoutLabel : UILabel

{

@private

    CGFloat characterSpacing_;       //字间距

@private

  long linesSpacing_;   //行间距

}

@property(nonatomic,assign) CGFloat characterSpacing;

@propery(nonatomic,assign)long linesSpacing;

@end

 

#import "TextLayoutLabel.h"

#import<CoreText/CoreText.h>

@implementation TextLayoutLabel

@synthesize characterSpacing = characterSpacing_;

@synthesize linesSpacing = linesSpacing_;

-(id) initWithFrame:(CGRect)frame

 {//初始化字间距、行间距

  if(self =[super initWithFrame:frame])

{

  self.characterSpacing = 2.0f;

  self.linesSpacing = 5.0f;

}

return self;

}

 

-(void)setCharacterSpacing:(CGFloat)characterSpacing //外部调用设置字间距

{

characterSpacing_ = characterSpacing;

[self setNeedsDisplay];

}

 

-(void)setLinesSpacing:(long)linesSpacing  //外部调用设置行间距

{

  linesSpacing_ = linesSpacing;

  [self setNeedsDisplay];

}

 

-(void) drawTextInRect:(CGRect)requestedRect

{

//去掉空行

NSString *labelString = self.text;

NSString *myString = [labelString stringByReplacingOccurrencesOfString:@"\r\n" withString:"\n"];

//创建AttributeString

NSMutableAttributedString *string =[[NSMutableAttributedString alloc]initWithString:self.text];

//设置字体及大小

CTFontRef helveticaBold = CTFontCreateWithName((CFStringRef)self.font.fontName,self.font.pointSize,NULL);

[string addAttribute:(id)kCTFontAttributeName value:(id)helveticaBold range:NSMakeRange(0,[string length])];

//设置字间距

if(self.characterSpacing)

{

  long number = self.characterSpacing;

  CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);

  [string addAttribute:(id)kCTkernAttributeName value:(id)num rang:NSMakeRange(0,[string length])];

  CFRelease(num);

}

//设置字体颜色

[string addAttribute:(id)kCTForegroundColorAttributeName value:(id)(self.textColor.CGColor) range:NSMakeRange(0,[string length])];

//创建文本对齐方式

CTTextAlignment alignment = kCTLeftTextAlignment;

if(self.textAlignment == UITextAlignmentCenter)

{

   alignment = kCTCenterTextAlignment;

}

if(self.textAlignment == UITextAlignmentRight)

{

  alignment = kCTRightTextAlignment;

}

CTParagraphStyleSetting alignmentStyle;

alignmentStyle.spec = kCTParagraphStyleSpecifierAlignment;

alignmentStyle.valueSize = sizeof(alignment);

alignmentStyle.value = &alignment;

//设置文本行间距

CGFloat lineSpace = self.linesSpacing;

CTParagraphStyleSetting lineSpaceStyle;

 lineSpaceStyle.spec = kCTparagraphStyleSpecifierLineSpacingAdjustment;

 lineSpaceStyle.valueSize = sizeof(lineSpace);

 lineSpaceStyle.value =&lineSpace;

//设置文本段间距

CGFloat paragraphSpacing = 5.0;

CTparagraphStyleSetting paragraphSpaceStyle;

 paragraphSpaceStyle.spec = kCTparagraphStyleSpecifierParagraphSpacing;

 paragraphSpaceStyle.valueSize = sizeof(CGFloat);

 paragraphSpaceStyle.value = &paragraphSpacing;

 

//创建设置数组

CTParagraphStyleSetting settings[ ] ={alignmentStyle,lineSpaceStyle,paragraphSpaceStyle};

CTParagraphStyleRef style = CTParagraphStyleCreate(settings ,3);

//给文本添加设置

[string addAttribute:(id)kCTParagraphStyleAttributeName value:(id)style range:NSMakeRange(0 , [string length])];

//排版

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);

CGMutablePathRef leftColumnPath = CGPathCreateMutable();

CGPathAddRect(leftColumnPath, NULL ,CGRectMake(0 , 0 ,self.bounds.size.width , self.bounds.size.height));

CTFrameRef leftFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0, 0), leftColumnPath , NULL);

//翻转坐标系统(文本原来是倒的要翻转下)

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetTextMatrix(context , CGAffineTransformIdentity);

CGContextTranslateCTM(context , 0 ,self.bounds.size.height);

CGContextScaleCTM(context, 1.0 ,-1.0);

//画出文本

CTFrameDraw(leftFrame,context);

//释放

CGPathRelease(leftColumnPath);

CFReleale(framesetter);

CFRelease(helveticaBold);

[string release];

UIGraphicsPushContext(context);

 

}

@end

 

 

 

IOS利用Core Text对文字进行排版

core text 这个包默认是没有的,要自己手动添加进来。 在IOS中利用core text对文本进行排版的几个关键点如下:      字间距:kCTKernAttributeName    ...
  • lgm252008
  • lgm252008
  • 2013年05月23日 15:27
  • 670

IOS利用Core Text对文字进行排版

core text 这个包默认是没有的,要自己手动添加进来。 在IOS中利用core text对文本进行排版的几个关键点如下:      字间距:kCTKernAttributeName    ...
  • RANKAIHUA
  • RANKAIHUA
  • 2014年01月02日 14:25
  • 575

iOS开发 Coretext(文字排版)的基本用法

oreText 框架中最常用的几个类:   CTFontCTFontCollectionCTFontDescriptorCTFrameCTFramesetterCTGlyphInfoCTL...
  • wangzhaobin
  • wangzhaobin
  • 2015年04月10日 09:45
  • 2561

IOS利用Core Text对文字进行排版

原贴地址:http://hi.baidu.com/jwq359699768/blog/item/5df305c893413d0a7e3e6f7b.html core text 这个包默认是没有的...
  • zixiweimi
  • zixiweimi
  • 2014年07月04日 10:47
  • 280

IOS利用Core Text对文字进行排版

原贴地址:http://hi.baidu.com/jwq359699768/blog/item/5df305c893413d0a7e3e6f7b.html  core text ...
  • volcan1987
  • volcan1987
  • 2013年06月03日 14:59
  • 921

基于 CoreText 的排版引擎:基础

本章前言 使用 CoreText 技术,我们可以对富文本进行复杂的排版。经过一些简单的扩展,我们还可以实现对于图片,链接的点击效果。CoreText 技术相对于 UIWebView,有着更少的内存占...
  • chaoyuan899
  • chaoyuan899
  • 2015年06月27日 17:11
  • 2258

ios开发文字排版,段落排版,富文本

1,使用NSMutableAttributedString设置文字的各种属性 1)第一种方式 建立一个属性字典,,用字典和字符串初始化NSMutableAttributedString对象,这个对象就...
  • walden00
  • walden00
  • 2015年09月09日 15:32
  • 3771

iOS 段落文字排版的属性与细节

iOS 段落文字排版的属性与细节  iOS 6 之后,iOS 的文字显示组件中提供了一个可以调整文字细节属性的NSAttributedString 类别,可以针对文字内容的全部与部份区域改变显示的方...
  • u014641631
  • u014641631
  • 2015年02月16日 17:26
  • 1580

实现TextView 文字排版,分散两端对齐

参考:http://www.cnblogs.com/lcyty/p/3265335.html 方法一:使用HTML TextView textview=(TextView)findVi...
  • mxbhxx
  • mxbhxx
  • 2014年06月04日 11:09
  • 6710

CoreText:绘制纯文本内容

文字排版的基础概念 字体(Font):和我们平时说的字体不同,计算机意义上的字体表示的是同一大小,同一样式(Style) 字形的集合。从这个意义上来说,当我们为文字设置粗体,斜体时其实是使用...
  • longshihua
  • longshihua
  • 2016年08月01日 13:56
  • 768
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS利用Core Text对文字进行排版
举报原因:
原因补充:

(最多只允许输入30个字)