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

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

如图:

代码如下:

- (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);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.iOS中的round、ceil、floor函数略解 round如果参数是小数,则求本身的四舍五入.ceil如果...
    K_Gopher阅读 1,199评论 1 0
  • 最近在网上看了一些大牛的文章,自己也试着写了一下,感觉图文混排真的很强大。 废话不多说,开始整 先上效果图跟代码,...
    AllureJM阅读 1,012评论 0 1
  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,773评论 2 10
  • iOS没有现成的支持图文混排的控件,而要用多个基础控件组合拼成图文混排这样复杂的排版,是件很苦逼的事情。对此的解决...
    清风沐沐阅读 680评论 0 2
  • 年前一直在纠结文字样式问题,领导总觉得聊天那块的文字字体不好看,尝试了好几种方法后调出一种效果。 1.先看...
    南枫小谨阅读 1,230评论 0 0