美文网首页
CoreText图文混排实现简单的文字形状排布

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

作者: AllureJM | 来源:发表于2017-08-16 17:06 被阅读0次

    刚接触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);

    相关文章

      网友评论

          本文标题:CoreText图文混排实现简单的文字形状排布

          本文链接:https://www.haomeiwen.com/subject/ohoirxtx.html