CoreText图文混排实现简单的文字形状排布

刚接触CoreText,目前项目想做一个文字全部居中,并且逐渐变宽的效果

如图:

CoreText图文混排实现简单的文字形状排布_第1张图片

代码如下:

- (void)drawRect:(CGRect)rect {

[super drawRect:rect];

// 步骤1:得到当前用于绘制画布的上下文,用于后续将内容绘制在画布上

// 因为Core Text要配合Core Graphic 配合使用的,如Core Graphic一样,绘图的时候需要获得当前的上下文进行绘制

CGContextRef context = UIGraphicsGetCurrentContext();

// 步骤2:翻转当前的坐标系(因为对于底层绘制引擎来说,屏幕左下角为(0,0))

CGContextSetTextMatrix(context, CGAffineTransformIdentity);

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

CGContextScaleCTM(context, 1.0, -1.0);

// 步骤3:创建绘制区域

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddEllipseInRect(path, NULL, self.bounds);

// 步骤4:创建需要绘制的文字与计算需要绘制的区域

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:@"iOS程序在启动时会创建一个主线程,而在一个线程只能执行一件事情,如果在主线程执行某些耗时操作,例如加载网络图片,下载资源文件等会阻塞主线程(导致界面卡死,无法交互),所以就需要使用多线程技术来避免这类情况。iOS中有三种多线程技术 NSThread,NSOperation,GCD,这三种技术是随着IOS发展引入的,抽象层次由低到高,使用也越来越简单。"];

// 步骤5:根据AttributedString生成CTFramesetterRef

CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);

CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, [attrString length]), path, NULL);

// 步骤6:进行绘制

CTFrameDraw(frame, context);

// 步骤7.内存管理

CFRelease(frame);

CFRelease(path);

CFRelease(frameSetter);

}

注:CGPathAddEllipseInRect是设置椭圆形状

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddEllipseInRect(path, NULL, self.bounds);

你可能感兴趣的:(CoreText图文混排实现简单的文字形状排布)